通过 C exec() 执行 IPtables
executing IPtables via C exec()
我正在尝试在这里编写一个程序来阻止给定 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);
}
您需要单独分离出每个值。命令行中以空格分隔的参数应该是单独的数组元素。参数列表中的第一个参数始终是程序的名称。
此外,请确保对 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);
}
我正在尝试在这里编写一个程序来阻止给定 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);
}
您需要单独分离出每个值。命令行中以空格分隔的参数应该是单独的数组元素。参数列表中的第一个参数始终是程序的名称。
此外,请确保对 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);
}