2016-04-11 9 views
1

ich einen String und einen Befehl Folge haben, so dass ich sie vergleichen wollen:Vergleichen Sie das Ergebnis des Befehls mit String in bash

A="Chain INPUT (policy ACCEPT) 
target  prot opt source    destination 

Chain FORWARD (policy ACCEPT) 
target  prot opt source    destination 

Chain OUTPUT (policy ACCEPT) 
target  prot opt source    destination" 

B=$(iptables -L) 

if [ "$A" == "$B"]; then 
    echo "True" 
else 
    echo "False" 
fi 

Aber es gibt False.

+0

Nein .. Das funktioniert nicht wirklich .. – MLSC

+1

Sie brauchen einen Platz vor dem schließenden BH wie folgt: 'if [" $ A "==" $ B "]; dann ". Aus Kompatibilitätsgründen ist es besser, single equal zu verwenden. wie 'if [" $ A "=" $ B "]; dann ". – user000001

+1

Kennt jemand ein gutes kanonisches Duplikat dafür? Es ist ein ziemlich häufiges Problem. –

Antwort

3

Es ist aufgrund der unterschiedlichen Menge an Leerzeichen verwendet. Sie können feststellen, dass Sie sich den folgenden Befehl:

diff -u <(iptables -L) - <<EOF | cat -A 
Chain INPUT (policy ACCEPT) 
target  prot opt source    destination 

Chain FORWARD (policy ACCEPT) 
target  prot opt source    destination 

Chain OUTPUT (policy ACCEPT) 
target  prot opt source    destination 
EOF 

Ausgang:

--- /dev/fd/63^I2016-04-11 08:59:52.663962140 +0200$ 
+++ -^I2016-04-11 08:59:52.666667769 +0200$ 
@@ -1,8 +1,8 @@$ 
Chain INPUT (policy ACCEPT)$ 
-target  prot opt source    destination   $ 
+target  prot opt source    destination$ 
$ 
Chain FORWARD (policy ACCEPT)$ 
-target  prot opt source    destination   $ 
+target  prot opt source    destination$ 
$ 
Chain OUTPUT (policy ACCEPT)$ 
-target  prot opt source    destination   $ 
+target  prot opt source    destination$ 

Sie sehen, der iptables -L Befehl anhängt Leerzeichen nach destination.

dass Leerzeichen zu entfernen, Sie sed verwenden können:

iptables -L | sed 's/[[:space:]]*$//' 

Wenn Sie auch die syntax error beheben von Jonathan Leffler entdeckt, sollte Ihr Code arbeiten.

Lassen Sie mich hinzufügen, dass die Art, wie Sie überprüfen, ob "die Firewall nicht aktiv ist" könnte zu schwach sein. (a) Sie sehen, dass der Befehl iptables -L nicht wirklich für die Textverarbeitung gedacht ist. (b) jemand könnte eine benutzerdefinierte Kette hinzugefügt haben, aber keine Regeln drin. Dies würde Ihre Prüfung fehlschlagen lassen.

Ich habe nicht wirklich eine Idee, wie es besser geht. Wahrscheinlich ist das Ändern von Firewall-Regeln eine Aufgabe, die vom Administrator selbst und nicht von Programmen ausgeführt wird. :)

2

Abstand!

Falsch:

if [ "$A" == "$B"]; then 

Rechts:

if [ "$A" == "$B" ]; then 

[ ist ein Befehl; es erfordert Leerzeichen um seine separaten Argumente (und um seinen Namen [), und sein letztes Argument muss ] sein. Es gibt Gründe zu argumentieren, dass = eher als == portabler ist (aber == funktioniert OK in Bash).

+0

Das ist falsch .. weil es in allen Zuständen false zurückgibt – MLSC

+1

Der Syntaxfehler ist korrekt identifiziert und behoben. Wenn Sie auch Probleme mit dem Abstand in Ihrer Zeichenfolge haben, ist das ein separater bag'o'worms, der schwer für jeden ist, der nicht auf Ihrem Computer ist, um zu beheben. Sie erhalten also einen Syntaxfehler vom 'test' (aka' ['' ''' Befehl, wenn Sie das ausführen, was Sie angezeigt haben. Der Test kann auch fehlschlagen, nachdem die Syntax aufgrund von Abstandsproblemen behoben wurde. –

1

Es tut Match wegen Leerzeichen am Ende in iptables -L

A=$(cat <<EOF 
Chain INPUT (policy ACCEPT) 
target  prot opt source    destination 

Chain FORWARD (policy ACCEPT) 
target  prot opt source    destination 

Chain OUTPUT (policy ACCEPT) 
target  prot opt source    destination 
EOF 
) 
B="$(iptables -L)" 

diff -Z <(echo "$A") <(iptables -L) && echo "True" || echo "False" 

Check this:

meld differences

btw aufgerufen, um den meld Befehl wie folgt aus: meld <(echo "$A") <(iptables -L) (meld ist ein visuelles diff Werkzeug)

+0

Wenn "false" zurückgegeben wird, werden einige junc-Daten angezeigt, die sich auf den diff-Befehl beziehen. Wie kann ich sie verwerfen und nur 'false' drucken? – MLSC

+1

@ MLSC verwenden Sie dies: 'Diff -q -Z <(echo" $ A ") <(iptables -L) && echo" True "|| echo "False" ', hier bedeutet die' -q'-Option s 'quiet', d. h. '-q, --brief Bericht nur, wenn Dateien sich unterscheiden ' – ritesht93

Verwandte Themen