¿Qué significa ^ $ y ^ # significa?

17

No entiendo BADIPS=$(egrep -v "^#|^$" $tDB) . ¿Puedes explicarlo? código completo:

#!/bin/bash
# Purpose: Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code. #
# See url for more info - http://www.cyberciti.biz/faq/?p=3402
# Author: nixCraft <www.cyberciti.biz> under GPL v.2.0+
# -------------------------------------------------------------------------------
ISO="af cn" 

### Set PATH ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep

### No editing below ###
SPAMLIST="countrydrop"
ZONEROOT="/root/iptables"
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"

cleanOldRules(){
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}

# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT

# clean old rules
cleanOldRules

# create a new iptables list
$IPT -N $SPAMLIST

for c  in $ISO
do 
    # local zone file
    tDB=$ZONEROOT/$c.zone

    # get fresh zone file
    $WGET -O $tDB $DLROOT/$c.zone

    # country specific log message
    SPAMDROPMSG="$c Country Drop"

    # get 
    BADIPS=$(egrep -v "^#|^$" $tDB)
    for ipblock in $BADIPS
    do
       $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
       $IPT -A $SPAMLIST -s $ipblock -j DROP
    done
done

# Drop everything 
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST

# call your other iptable script
# /path/to/other/iptables.sh

exit 0
    
pregunta QChí Nguyễn 04.11.2016 - 16:00

2 respuestas

31

^ es el carácter especial de una expresión regular usado para marcar el inicio de la línea, y $ marca el final de la línea. Están acostumbrados a anclar la expresión en estos puntos. Entonces, ^# es una línea que comienza con # , y ^$ es una línea vacía (ya que no hay nada entre el inicio y el final).

-v en grep anula la coincidencia, por lo que este comando busca líneas que no estén comentadas (no comenzando con # ), o vacías.

    
respondido por el muru 04.11.2016 - 16:05
15

egrep busca archivos que coincidan con un patrón.

La opción -v (o --invert-match ) de egrep invierte el sentido de coincidencia, para seleccionar líneas que no coinciden.

"^#|^$" evalúa como una línea en blanco o una línea que comienza con un # que es una línea de comentario, ninguno de los cuales es ejecutado por bash. Invertir la coincidencia se evalúa con líneas que no son ni líneas en blanco ni líneas de comentario.

$tDB es una variable que almacena el valor del archivo de zona local.

Poniéndolo todo junto, las direcciones IP incorrectas (IPs a ser bloqueadas) se almacenan en BADIPS, que almacena los valores de direcciones IP incorrectas obtenidas de una lista de archivos de zona local.

    
respondido por el karel 04.11.2016 - 16:05

Lea otras preguntas en las etiquetas