Os scripts do shell não são exatamente o mesmo que digitar em um terminal.
O que vai acontecer aqui é que iptables-save
vai esperar que sudo su
seja concluído e, em seguida, execute. O que você deseja é executar iptables-save
dentro do sudo
.
Em segundo lugar, sudo su
está entre as categorias de exemplos de 'uso inútil'. O equivalente correto é sudo -i
.
Existem 2 abordagens que você pode tomar para resolver isso.
Método 1
sudo -i <<'EOF'
iptables-save | awk '/^[*]/ { print $1 }
/^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
/COMMIT/ { print $0; }' | iptables-restore
EOF
Isso basicamente lança um shell de root e envia esse comando através do shell.
O motivo pelo qual não adicionamos apenas sudo
na frente dos comandos iptables-save
e iptables-restore
é que ele lançará 2 sudo
s ao mesmo tempo. Isso não funciona bem se os dois acabarem tentando solicitar a senha.
Portanto, essa solução funciona em torno do problema, lançando apenas um único sudo
.
Uma linha
Conforme solicitado em seu comentário, você pode fazer isso em uma única linha, mas fica muito mais difícil de ler.
sudo -i sh -c 'iptables-save | awk '\''/^[*]/ { print $1 }; /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }; /COMMIT/ { print $0; }'\'' | iptables-restore'
Método 2
sudo -v
sudo -n iptables-save | awk '/^[*]/ { print $1 }
/^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
/COMMIT/ { print $0; }' | sudo -n iptables-restore
Esta solução executa sudo
pela primeira vez, sem nenhum comando, simplesmente -v
. Isso faz com que sudo
solicite sua senha se sua sessão expirar. Então, qualquer comando executado dentro dessa janela de expiração da sessão não exigirá uma senha. Portanto, lançar 2 sudo
s ao mesmo tempo não é mais um problema, pois nenhum deles solicitará (adicionamos -n
para ter certeza absoluta disso. Isso causará um erro se tentar).