使用 execve() 寻找匹配的“”时出现意外的 EOF
unexpected EOF while looking for matching `'' while using execve()
我尝试通过 execve() 运行 多个命令(或使用简单的输出重定向)。
当我把这个(当然,在我把这个字符串传递给函数之前,我把它分成空格,然后把每个分开放到 char* []):
"bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' "
到 execve() 函数,我有一个错误:
/usr/bin/cat: -c: line 0: unexpected EOF while looking for matching `''
/usr/bin/cat: -c: line 1: syntax error: unexpected end of file
这是我对 运行 多个 linux 命令(位于 PATH 中的应用程序)的建议,使用 exactly execve() 函数(出于安全原因)
但是这个解决方案并不像我预期的那样有效。
有什么办法可以解决我的问题吗?也许我可以使用 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] = '[=11=]';
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;
}
由于您的代码是刚刚编写的,我认为它会执行带有参数的可执行文件 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
中处理 near-arbitrary 命令(在这种情况下,我会退后一步思考'这真的是正确的方法吗?正在做 X?')。
此外,execve
需要二进制文件的完整路径作为其第一个参数;它不搜索 PATH
.
另外^2:您的标题提到反引号 `
,但您的示例代码提到单引号 right-quotes '
– 您知道它们非常不同,是吗?
如果这样做对我有用:
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
可能只解释第一个命令参数,所以你最终会执行 '
命令 ...
虽然可能有更好的方法...
我尝试通过 execve() 运行 多个命令(或使用简单的输出重定向)。
当我把这个(当然,在我把这个字符串传递给函数之前,我把它分成空格,然后把每个分开放到 char* []):
"bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' "
到 execve() 函数,我有一个错误:
/usr/bin/cat: -c: line 0: unexpected EOF while looking for matching `''
/usr/bin/cat: -c: line 1: syntax error: unexpected end of file
这是我对 运行 多个 linux 命令(位于 PATH 中的应用程序)的建议,使用 exactly execve() 函数(出于安全原因)
但是这个解决方案并不像我预期的那样有效。
有什么办法可以解决我的问题吗?也许我可以使用 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] = '[=11=]';
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;
}
由于您的代码是刚刚编写的,我认为它会执行带有参数的可执行文件 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
中处理 near-arbitrary 命令(在这种情况下,我会退后一步思考'这真的是正确的方法吗?正在做 X?')。
此外,execve
需要二进制文件的完整路径作为其第一个参数;它不搜索 PATH
.
另外^2:您的标题提到反引号 `
,但您的示例代码提到单引号 right-quotes '
– 您知道它们非常不同,是吗?
如果这样做对我有用:
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
可能只解释第一个命令参数,所以你最终会执行 '
命令 ...
虽然可能有更好的方法...