我的问题是关于C系统调用的exec系列.我如何预测正在执行的程序正在寻找什么类型的输入,因为exec系列在字符串列表arg1,arg2,arg3 ...和参数的2d char数组之间变化.大多数Linux命令行程序可以处理两种形式的输入吗?
例如:
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);
Run Code Online (Sandbox Code Playgroud)
如果我执行ls会发生什么:
execl('/bin/ls', 'ls', NULL);
Run Code Online (Sandbox Code Playgroud)
与:
execv('/bin/ls', lsArgsArray);
Run Code Online (Sandbox Code Playgroud)
大概ls可以处理两种形式的输入,但我真正的问题是关于其他实用程序的通用,是否可以安全地假设你可以以任何方式调用它们?如果使用任何一种方法调用都不安全,那么bash会如何区分使用哪种?
无论你调用什么程序,执行程序和内核都看不出任何差别:它们都被C库转换为相同的系统调用.执行的程序在内核之后又增加了一步,因此看到任何差异的机会更少.
对于确切的内核接口,请查看内核或平台C库的源代码.
shell(bash/ash/csh/sh/...)没有任何特权.但是,直接进入API调用允许您传递虚假程序名称.