如何将字符串参数传递给execve

时间:2015-01-30 22:11:06

标签: c exec system

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

-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;
}

2 个答案:

答案 0 :(得分:3)

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

tshark -f "not src host 1.1.1.1"

并不意味着你需要他们在exec。事实上,这些引用告诉shell&#34;这是一个参数&#34;,所以shell不会在空格上拆分并将字符串(不带引号)作为程序的一个参数传递。所以,在C中,你只需:

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

并将其传递给exec。

虽然我们正在进行,但重定向如

2>errfile

被shell拦截而没有传递给命令,所以他们不会在exec中工作。你必须自己做dup(),或者只是将一个完整的shell命令传递给shell(这是一个安全禁忌)。

答案 1 :(得分:1)

正如评论中所解释的那样,重定向不适用于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;
}

您基本上是使用sh选项启动-c shell并将其作为选项传递给您。