
Ich bin ein relativer „Anfänger“ in der Welt von Linux und Bash und komme damit nicht klar.
Unter anderem möchte ich iptables ändern, wenn „String“ dort nicht vorhanden ist, aber das scheint nicht zu funktionieren. Ich bin nicht sicher, ob dies an den if-Anweisungen, dem Exit-Code, der Syntax oder den Sudo-Berechtigungen oder anderen Dingen liegt.
Wenn das Skript automatisch über Cron ausgeführt wird, führt es die if
Klausel aus, auch wenn iptables
es die gesuchte Zeichenfolge enthält. Dies wird überprüft durch
- Drucken von iptables im Terminal sowohl Sekunden vor als auch nach einem geplanten Lauf
echo "this" >>/log/file.log
indem Sie der if-Klausel ein hinzufügen .
Nimm 1:
#!/bin/bash
iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then
command-to-perform
fi
Nimm 2:
#!/bin/bash
iptablesvar=$(iptables -L -v -n)
if [[ $iptablesvar != *"8.8.8.8"* ]]; then
command-to-perform
fi
Ich habe beides versucht, ausgelöst durch (sudo) crontab mit der folgenden Zeile:
*/1 * * * * /bin/bash /home/username/path/to/script-file.sh
Was mich verblüfft, ist, dass beide oben genannten Optionen zu funktionieren scheinen, wenn sie wie folgt direkt in das Terminal eingegeben werden:
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
Was gibt?
Falls relevant, mein System ist ein frisches Linux Mint 19.3 Tricia
Antwort1
Ich werde das dann selbst beantworten - alle Credits an@Stahlfahrer'SKommentar:
iptables
ist nicht in Crons PATH
. Befehl geändert, um vollständigen Pfad einzuschließen /sbin/iptables
.