我尝试通过execve()运行多个命令(或使用简单的输出重定向)。
当我放置它时(当然,在将该字符串传递给函数之前,我将其分成多个空格,并将每个空格分别放入char * []):
"bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' "
到execve()函数,出现错误:
/ usr / bin / cat:-c:第0行:寻找匹配的`''时出现意外的EOF
/ usr / bin / cat:-c:第1行:语法错误:文件意外结束
这是我的建议,使用确切的execve()函数运行多个linux命令(位于PATH中的应用程序)(出于安全原因)
但是这种解决方案不符合我的预期。
有解决我的解决方案的主意吗?也许我可以使用execve(),但是我不知道如何。
编辑:添加了简化的(抱歉,由于公司限制,我无法粘贴原始格式)源代码:
int foo(const char *cmdline)
{
char d[] = "bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' ";
args = strtok(d, " ");
counter = 0;
while (args != NULL)
{
cmdline_args[counter++] = args;
args = strtok(NULL, " ");
}
cmdline_args[counter] = '\0';
switch (pid = fork()) {
case -1:
ret = -1;
case 0: // for execve
status = execve(cmdline_args[0], cmdline_args, env);
exit(status);
default: // for parent pid
if (waitpid(pid, &status, 0) < 0) {
// in case when waitpid failed
}
}
return ret;
}
如果这样做,对我有用:
cmdline_args[0] = "bash";
cmdline_args[1] = "-c";
cmdline_args[2] = "/usr/bin/cat /root/script.sh > /root/script1.sh";
cmdline_args[3] = NULL;
因此,问题在于您要在中处理整个命令行字符串strtok
。因此,它将bash
获得多个参数(不仅是一个参数,还包括整个命令字符串)。bash
可能只是解释第一个命令参数,所以您最终将执行'
命令...
也许有更好的方法可以做到这一点...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句