[英]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.