当以用户ec2-user身份运行以下脚本时,出现iptables v1.4.18: can't initialize iptables table filter: Permission denied (you must be root)错误消息iptables v1.4.18: can't initialize iptables table filter: Permission denied (you must be root)
脚本:
#!/bin/sh # Offending IP as detected by mod_evasive # Add the following firewall rule (block IP) $IPTABLES -I INPUT -s $IP -j DROP
我怎样才能运行iptables作为一个非root用户来阻止一个IP地址?
注意:这个脚本通常由mod_evasive调用
在脚本上设置setuid位,以便它始终以root身份运行。
chown root myscript chmod u+s myscript
基于你在这里提出的另一个评论,你遇到的问题是bash无法find你正在尝试运行的脚本。
当您运行的脚本或命令不在$PATH环境设置中定义的path之一时,您需要为其提供绝对path或相对path。 例如:
/usr/local/bin ,则需要运行/usr/local/bin/scriptname.sh 。 /home/username/scriptname.sh或~/scriptname.sh 。 ./调用它: ./ ./scriptname.sh 另外,您可以通过修改.bash_profile , .bashrc或.profile来更新您的$PATH环境设置和脚本的path,具体取决于您使用的是什么env文件。
只需在命令之前添加sudo即可:
#!/bin/sh # Offending IP as detected by mod_evasive # Add the following firewall rule (block IP) sudo $IPTABLES -I INPUT -s $IP -j DROP
如果您的脚本是:
/drop.sh
看起来像这样:
#!/bin/sh exec /sbin/iptables -I INPUT -s "$1" -j DROP
然后在/etc/sudoers文件中添加一行,如下所示:
www-data ALL=(root) NOPASSWD: /drop.sh
注意,如果Apache作为除www-data之外的用户运行,则需要在此处使用该用户名。 这让Apache用户运行你的drop.sh
然后,最后一个mod_evasive的包装:
#!/bin/sh exec sudo /drop.sh "$@"