2016-02-05 139 views
0

我想在這裏做一個程序,阻止一個IP地址給定的IP地址作爲輸入字符串,即使該程序在後臺執行,參數似乎通過不正確。執行IPtables通過C執行()

我試圖執行以下使用我的功能:

iptables -A INPUT -p tcp --dport 21 -s xxx.xxx.xxx.xxx -j DROP 

我通過手動輸入它的命令行嘗試的命令,並在那裏工作,但我的計劃似乎並沒有處理該命令的方式相同。如何修復我的功能,以便程序發出參數,如上面的示例命令中所示?我也想避免使用system()呼叫。

這裏是我的功能:

function blockip(char* ip){ 
    char parameter[500]; 
    sprintf(parameter,"-s %s",ip); 
    char*args[20]={"-A INPUT","-p tcp --dport 21",parameter,"-j DROP",NULL}; 
    int stat,pid=fork(); 
    if (pid==0){ 
     execvp("iptables",args); 
    } 
    waitpid(pid,&stat,0); 
} 
+0

'-A INPUT'是兩個參數,而不是一個。其餘的一樣。 – immibis

+0

另外要注意的是,如果'execvp'失敗(可能是因爲沒有安裝iptables),你的程序就會開始變得非常奇怪,因爲孩子會開始做與父母相同的東西。 – immibis

回答

0

,需要在每個值單獨分離出來。在命令行中用空格分隔的參數應該是單獨的數組元素。參數列表中的第一個參數始終是程序的名稱。

此外,請務必做適當的錯誤檢查forkexecvp

void blockip(char* ip){ 
    char *args[]={"iptables", "-A", "INPUT", "-p", "tcp", 
       "--dport", "21", "-s", ip, "-j", "DROP", NULL }; 
    int stat,pid=fork(); 
    if (pid==-1) { 
     perror("fork failed"); 
     return; 
    if (pid==0){ 
     execvp("iptables",args); 
     perror("exec failed"); 
     exit(1); 
    } 
    waitpid(pid,&stat,0); 
} 
+0

好吧,現在我知道我忘了什麼......指定程序名稱作爲參數。這對我來說很奇怪。 – Mike