Tengo una parte del script de actualización de VoIPBL.
cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}'
Crea líneas como esta:
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
Entiendo que la segunda parte consiste en agregar una línea del archivo (IP) a un ipset, pero ¿qué hace la condición de prueba? ¿Qué significa cuando tienes -z y -a en el mismo conjunto de paréntesis? ¿Y qué significa la parte no igual a "#"?
Respuesta1
Presumiblemente lee las IP del /tmp/voipbl.txt
archivo y luego crea un shell si se construye en base a ellas. El $1
parámetro del script awk se refiere al elemento en la primera columna de cada línea, por lo que la cadena en lugar de 1.2.3.4/32
será ese valor en cada iteración.
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then
! -z "1.2.3.4/32"
- Está comprobando que "1.2.3.4/32"
no sea nulo. -z
comprueba si la cadenaescero pero !
lo niega. Esto podría y probablemente debería reemplazarse con -n
lo que solo verifica que no sea nulo.
"1.2.3.4/32" != "#"
- Está comprobando que "1.2.3.4/32"
no es igual a #
lo cual supongo que es algo que podría aparecer en tu expediente.
El -a
operador significay. Por lo tanto, se verifica que la cadena no sea nula Y que no sea igual #
.
Si se cumplen estas condiciones, se ejecutará lo siguiente:
/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"
Para comprender esto mejor, intente ejecutar el comando awk en un archivo con el siguiente contenido:
1.2.3.4/32
# 3.4.5.6/32
Si ahora ejecuta su comando awk en ese archivo, obtendrá:
$ 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;
Las pruebas garantizan que /usr/sbin/ipset
solo se ejecutará en la primera línea, y 1.2.3.4/32
no en las otras dos.