Я пытаюсь сделать здесь программу, которая блокирует 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);
}
'-A INPUT' - это два аргумента, а не один. То же самое для остальных. – immibis
Также обратите внимание, что если 'execvp' не работает (возможно, потому что iptables не установлен), ваша программа начнет действовать очень странно, так как ребенок начнет делать то же самое, что и родительский. – immibis