2012-04-09 32 views
2

execve()究竟做了什麼?我試着看文檔(http://linux.die.net/man/2/execve),但鑑於我對linux非常陌生,並且這種編程並沒有多大意義。我想要做的是能夠執行此命令:execve()做什麼?

nc -l -p someport -e /bin/sh 

我可以這樣做以下(其中someport是一個數字,如4444)

char *command[2]; 
command[0] = "nc -l -p someport -e /bin/sh" 
execve(command[0], name, NULL); 

回答

5

正確的用法是

extern char * const environ[]; 
char * const command[] = {"nc", "-l", "-p", "porthere", "-e", "/bin/sh", NULL}; 
execve("/usr/bin/nc", command, environ); 

您必須使用完整路徑名,而不是簡短名稱,如"nc"(更確切地說:沒有PATH搜索完成,路徑名必須是實際存在的文件),並且必須將arg事先將其分成不同的字符串。您還需要以某種方式傳播環境,無論是通過上面代碼段中提到的extern environ還是從main()的第三個參數獲得;後者稍微更加標準化,但可能會更加痛苦地按需傳遞。

+0

我是否正確地假設在「porthere」之後應該有逗號? – Nosrettap 2012-04-09 02:52:51

+0

對不起,是的,這是一個錯字。定影。 – geekosaur 2012-04-09 02:55:54

+0

下面的答案好多了 – 2014-05-05 16:53:40

12

execve用新進程替換當前進程,運行您指定的命令作爲其第一個參數。

機會很不錯,你想要execvpexeclp取而代之 - 你沒有提到任何關於想爲孩子提供環境的任何事情,但從你可能希望找到可執行文件的路徑你正在使用。