Defina o bit setuid no script, para que ele sempre seja executado como root.
chown root myscript
chmod u+s myscript
Ao executar o seguinte script como usuário ec2-user
, recebo a mensagem de erro iptables v1.4.18: can't initialize iptables table filter: Permission denied (you must be root)
Script:
#!/bin/sh
# Offending IP as detected by mod_evasive
# Add the following firewall rule (block IP)
$IPTABLES -I INPUT -s $IP -j DROP
Como posso executar iptables
como usuário não-root para bloquear um endereço IP?
NB: Este script geralmente é chamado por mod_evasive
Defina o bit setuid no script, para que ele sempre seja executado como root.
chown root myscript
chmod u+s myscript
Com base em outro comentário que você fez aqui, o problema que você está enfrentando é que o bash não pode encontrar o script que você está tentando executar.
Quando você estiver executando um script ou comando que não esteja em um dos caminhos definidos na configuração $PATH
do ambiente, será necessário fornecer o caminho absoluto ou relativo para ele. Por exemplo:
/usr/local/bin
, você precisa executar /usr/local/bin/scriptname.sh
. /home/username/scriptname.sh
ou ~/scriptname.sh
. ./
da seguinte forma: ./scriptname.sh
Você também pode atualizar sua configuração de $PATH
do ambiente com o caminho para o script, modificando .bash_profile
, .bashrc
ou .profile
, dependendo de qual arquivo env você está usando.
Basta adicionar o sudo antes do comando:
#!/bin/sh
# Offending IP as detected by mod_evasive
# Add the following firewall rule (block IP)
sudo $IPTABLES -I INPUT -s $IP -j DROP
Se o seu script for:
/drop.sh
e se parece com isso:
#!/bin/sh
exec /sbin/iptables -I INPUT -s "$1" -j DROP
Em seguida, adicione uma linha ao seu arquivo /etc/sudoers
semelhante a:
www-data ALL=(root) NOPASSWD: /drop.sh
NB se o Apache estiver sendo executado como usuário além de www-data
, será necessário usar esse nome de usuário aqui. Isso permite que o usuário do Apache execute o seu drop.sh
Então, finalmente, um wrapper para mod_evasive
:
#!/bin/sh
exec sudo /drop.sh "$@"