2014-03-12 29 views
0

我的問題可能被描述爲「通過C setuid包裝器傳遞cmd行參數」的反面。這個問題問如何運行這個./cwrapper perl.pl --option1 --option2c包裝到perl腳本,它接受在包裝中硬編碼的參數

在我的情況下,Perl腳本嵌入在包裝。這個包裝來自第570頁「編程Perl」。它的工作原理---直到我在包裝器中的腳本後面添加一個參數。

此工程 - perl_script.pl產出預期結果:

#define REAL_SCRIPT "/path/to/script/perl_script.pl" 
main (ac, av) 
    char **av; 
{ 
    execv(REAL_SCRIPT, av); 
} 

這並不工作 - 例如perl_script輸出沒有什麼標準輸入或標準錯誤。注意「arg = 12345」:

#define REAL_SCRIPT "/path/to/script/perl_script.pl arg=12345" 
main (ac, av) 
    char **av; 
{ 
    execv(REAL_SCRIPT, av); 
} 

感謝您的任何線索。 John

回答

2

execv()的第一個參數是要執行的可執行文件的路徑。它在您將參數作爲第二個參數傳遞給execv()時起作用,但是當您將額外參數作爲可執行文件名稱的一部分傳遞時,execv()將失敗。

我注意到你的例子中缺少錯誤處理。我從上面報告的缺少錯誤消息推斷出,您沒有檢查並處理來自execv()的錯誤。它可能會告訴你爲什麼它不會運行你的程序。它返回整數,如果非零,則應該使用perror()查找錯誤。