我试图在这里创建一个程序,在IP地址作为输入字符串的情况下阻止IP地址,即使程序在后台执行,参数也似乎传递不正确。
我尝试使用我的函数执行以下操作:
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 :(得分: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);
}