【问题标题】:How to pass string argument to execve如何将字符串参数传递给execve
【发布时间】:2015-01-30 22:11:06
【问题描述】:

如何传递字符串参数,如下面的程序所示?

-f 后面的参数应该是一个带引号的字符串。我试图逃脱 \" 但没有用。我也尝试使用 ' and \' instead of \" 并再次失败。

#include <stdio.h>
#include <unistd.h>


int main(void)
{

    char *args[] =
    {
        "/usr/ws/bin/tshark", "-i", "/tmp/ts_pipe", "-w",
        "/tmp/output.pcap", "-f", "\"not src host 1.1.1.1\"", "2>", 
        "/tmp/error.log", NULL
    };

    char *envp[] =
    {
        "PATH=$PATH:/usr/wireshark/bin",
        "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib32",
        0
    };

    execve(args[0], &args[0], envp);
    fprintf(stderr, "Oops!\n");
    return -1;
}

【问题讨论】:

  • 请详细说明did not work
  • 重定向不起作用,它由 shell 处理,而不是应用程序本身,exec 系列函数不会启动 shell,除非你要求它运行,例如"/bin/sh".
  • execve 正在生成 tshark,但 tshark 退出时出现错误“tshark:使用“-f”和其他命令行参数指定了捕获过滤器。”
  • /usr/ws/bin/tshark -i /tmp/ts_pipe -f /tmp/output.pcap -f "not src host 1.1.1.1" 2> /tmp/error.log - 这个命令提示符 (bash) 中的命令有效。

标签: c exec system


【解决方案1】:

仅仅因为你在shell中需要引号,例如,

tshark -f "not src host 1.1.1.1"

并不意味着您在 exec 中需要它们。事实上,这些引号告诉外壳“这是一个参数”,因此外壳不会拆分空格并将字符串(不带引号)作为一个参数传递给程序。因此,在 C 语言中,您只需:

char *args[] = { "-f", "not src host 1.1.1.1" }

并将其传递给 exec。

当我们这样做时,重定向像

2>errfile

被 shell 拦截而不传递给命令,因此它们在 exec 中不起作用。您必须自己执行 dup(),否则只需将整个 shell 命令传递给 shell(这是安全禁忌)。

【讨论】:

    【解决方案2】:

    如 cmets 中所述,重定向不适用于 execve,但您可以尝试这样做:

    #include <stdio.h>
    #include <unistd.h>
    
    int main(void)
    {
    
        char *args[] =
        {
            "/bin/sh", "-c",
            "/usr/ws/bin/tshark -i /tmp/ts_pipe -w "
            "/tmp/output.pcap -f \"not src host 1.1.1.1\" 2> " 
            "/tmp/error.log", NULL
        };
    
        char *envp[] =
        {
            "PATH=$PATH:/usr/wireshark/bin",
            "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib32",
            0
        };
    
        execve(args[0], &args[0], envp);
        fprintf(stderr, "Oops!\n");
        return -1;
    }
    

    您基本上是在使用 -c 选项启动 sh shell 并将整个命令作为选项传递给它。

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 2018-05-07
      • 2016-08-02
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多