
Soy relativamente "principiante" en el mundo de Linux y bash y no puedo entender esto.
Entre otras cosas, quiero modificar iptables si la 'cadena' no existe allí, pero no parece funcionar. No estoy seguro si esto se debe a las declaraciones if, el código de salida, la sintaxis o los permisos sudo u otros.
Cuando el script se ejecuta automáticamente a través de cron, ejecuta la if
cláusula incluso si iptables
contiene la cadena que estoy buscando. Esto se verifica por
- imprimiendo iptables en la terminal segundos antes y después de una ejecución programada
- agregando un
echo "this" >>/log/file.log
a la cláusula if.
Toma 1:
#!/bin/bash
iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then
command-to-perform
fi
Tomar 2:
#!/bin/bash
iptablesvar=$(iptables -L -v -n)
if [[ $iptablesvar != *"8.8.8.8"* ]]; then
command-to-perform
fi
Probé ambos, activados por (sudo) crontab con la siguiente línea:
*/1 * * * * /bin/bash /home/username/path/to/script-file.sh
Lo que me desconcierta es que ambas opciones anteriores parecen funcionar cuando se ingresan directamente en la terminal de esta manera:
sudo iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then echo "not found" ;fi
if [ $? == 0 ]; then echo "found" ;fi
var=$(sudo iptables -L -n -v)
if [[ $var != *"8.8.8.8"* ]]; then echo "n" ;fi
if [[ $var == *"8.8.8.8"* ]]; then echo "y" ;fi
¿Lo que da?
Si es relevante, mi sistema es un Linux Mint 19.3 Tricia nuevo.
Respuesta1
Entonces responderé esto yo mismo - todos los créditos a@steeldriver'scomentario:
iptables
no está en cron PATH
. Se modificó el comando para incluir la ruta completa /sbin/iptables
.