Ich habe einen Teil des VoIPBL-Updateskripts.
cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}'
Es werden Zeilen wie diese erstellt:
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi; | sh
Ich verstehe, dass der zweite Teil darin besteht, eine Zeile aus der Datei (IP) zu einem IP-Set hinzuzufügen, aber was bewirkt die Testbedingung? Was bedeutet es, wenn Sie -z und -a in derselben Klammerngruppe haben? Und was bedeutet der Teil, der nicht gleich „#“ ist?
Antwort1
Es liest vermutlich IPs aus der /tmp/voipbl.txt
Datei und erstellt dann eine darauf basierende Shell-Konstruktion. Der $1
Parameter aus dem awk-Skript bezieht sich auf das Element in der ersten Spalte jeder Zeile, sodass die Zeichenfolge anstelle von 1.2.3.4/32
in jeder Iteration dieser Wert sein wird.
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then
! -z "1.2.3.4/32"
- Überprüft, ob die Zeichenfolge "1.2.3.4/32"
nicht null ist. -z
IstNull, aber das !
negiert das. Dies könnte und sollte wahrscheinlich durch ersetzt werden, -n
das nur auf Nicht-Null prüft
"1.2.3.4/32" != "#"
- Es wird geprüft, ob das "1.2.3.4/32"
nicht gleich ist. #
Ich vermute, dass dies in Ihrer Datei vorkommen könnte.
Der -a
Betreiber meintUnd. Es wird also überprüft, dass die Zeichenfolge nicht null ist UND dass sie nicht gleich ist #
.
Wenn diese Bedingungen erfüllt sind, wird Folgendes ausgeführt:
/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"
Um dies besser zu verstehen, versuchen Sie, den Befehl awk auf einer Datei mit folgendem Inhalt auszuführen:
1.2.3.4/32
# 3.4.5.6/32
Wenn Sie jetzt Ihren awk-Befehl für diese Datei ausführen, erhalten Sie:
$ awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}' file
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi;
if [ ! -z "" -a "" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "" ;fi;
if [ ! -z "#" -a "#" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "#" ;fi;
Die Tests stellen sicher, dass der Test /usr/sbin/ipset
nur auf der ersten Zeile ausgeführt wird 1.2.3.4/32
und nicht auf den anderen beiden.