通过 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);
}

您需要单独分离出每个值。命令行中以空格分隔的参数应该是单独的数组元素。参数列表中的第一个参数始终是程序的名称。

此外,请确保对 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);
}