在使用execve()时查找匹配的'''时意外的EOF

时间:2015-11-23 10:38:42

标签: c linux security execve

我尝试通过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;
}

1 个答案:

答案 0 :(得分:0)

如果这样做的话,对我有用:

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可能只解释第一个命令参数,因此您最终会执行'命令......

虽然可能有更好的方法来做到这一点......