【问题标题】:unexpected EOF while looking for matching `'' while using execve()在使用 execve() 时寻找匹配的“”时出现意外的 EOF
【发布时间】:2015-11-23 10:38:41
【问题描述】:

我尝试通过 execve() 运行多个命令(或使用简单的输出重定向)。

当我输入这个时(当然,在我将这个字符串传递给函数之前,我将其拆分为空格并将每个空格分别放入 char* []):

"bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' "

到 execve() 函数,我有一个错误:

/usr/bin/cat: -c: line 0: 寻找匹配的'''时出现意外的EOF

/usr/bin/cat: -c: line 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;
}

【问题讨论】:

  • 错误消息告诉您在传递给execve() 的字符串中某处有一个不匹配的引号。检查字符串并发布相关代码。
  • 展示你的C代码,什么时候展示更容易帮助
  • 我添加了代码。我想这足以理解函数的含义。 @BlueMoon 我也这么认为,但我不知道哪里有 bug。

标签: c linux security execve


【解决方案1】:

由于您的代码刚刚编写,我认为它会执行带有参数的可执行文件bash

[ "bash", "-c", "'", "/usr/bin/cat", "/root/script.sh", ">", "/root/script1.sh", "'", 0]

我猜你想要的目标是:

[ "/bin/bash", "-c", "/usr/bin/cat /root/script.sh >/root/script1.sh", NULL]

bash 二进制文件不太可能很好地响应参数 '。当bash 处理您键入的命令时,它会做很多复杂的工作来处理引用字符串的内容,并从中提取实际预期的参数。看起来你可能不得不重复其中的一些工作,如果你真的必须在cmdline 中处理近乎任意的命令(在这种情况下,我会退后一步想'这真的是做 X 的正确方法吗? ')。

另外,execve 需要二进制文件的完整路径作为其第一个参数;它不会搜索PATH

另外^2:你的标题提到了一个反引号`,但你的示例代码提到了一个右引号'——你知道它们非常不同,是吗?

【讨论】:

    【解决方案2】:

    如果这样做对我有用:

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

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

    【讨论】:

    • 你是对的。问题是由使用 strtok 引起的。感谢您的帮助。
    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多