通过C exec()执行IPtables

时间:2016-02-05 01:26:17

标签: c parameters exec fork iptables

我试图在这里创建一个程序,在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);
}

1 个答案:

答案 0 :(得分: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);
}