2016-02-05 1 views
0

Я пытаюсь сделать здесь программу, которая блокирует IP-адрес с учетом IP-адреса в качестве входной строки, и хотя программа выполняется в фоновом режиме, параметры, кажется, передаются неправильно ,Выполнение IPtables через C exec()

Я пытаюсь выполнить следующие с помощью моей функции:

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

Вам нужно отделить каждое значение по отдельности. Аргументы, разделенные пробелами в командной строке, должны быть отдельными элементами массива. Первым аргументом в списке аргументов всегда является имя программы.

Кроме того, обязательно выполните правильную проверку ошибок fork и execvp.

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