C语言 如何将字符串参数传递给可执行文件



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

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

仅仅因为您需要在外壳中使用引号,

tshark -f "not src host 1.1.1.1"

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

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

并将其传递给高管。

当我们在它时,重定向如

2>errfile

被 shell 拦截并且不会传递给命令,因此它们在 exec 中不起作用。你必须自己做 dup(),或者只是将整个 shell 命令传递给 shell(这是一个安全的禁忌)。

如注释中所述,重定向不适用于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,并将其作为选项传递整个命令。

最新更新