簡體   English   中英

如何將字符串參數傳遞給execve

[英]How to pass string argument to execve

如下面程序所示,如何傳遞字符串參數?

-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"

並不意味着您需要在exec中使用它們。 實際上,這些引號告訴外殼程序“這是一個參數”,因此外殼程序不會在空格上分割,而是將字符串(不帶引號)作為程序的一個參數傳遞。 因此,在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並將整個命令作為選項傳遞給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM