Que signifient ^ $ et ^ #?

17

Je ne comprends pas BADIPS=$(egrep -v "^#|^$" $tDB). Pouvez-vous l'expliquer? code complet:

#!/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
QChí Nguyễn
la source
1
grep alternatif grep '^[^#]'ce regex devrait s'attendre à au moins un caractère au début mais il ne devrait pas être un#
Avinash Raj

Réponses:

31

^est le caractère spécial d'une expression régulière utilisé pour marquer le début de la ligne et $marque la fin de la ligne. Ils sont utilisés pour ancrer l'expression à ces points. Il en ^#va de même pour toute ligne commençant par #, et ^$est une ligne vide (car il n'y a rien entre le début et la fin).

-vin grepannule la correspondance, donc cette commande recherche des lignes qui ne sont pas commentées (ne commençant pas par #) ou vides.

muru
la source
15

egrep recherche les fichiers correspondant à un modèle.

L' option -v (ou --invert-match) d'egrep inverse le sens de l'appariement pour sélectionner les lignes non appariées.

"^#|^$"correspond à une ligne vide ou à une ligne commençant par un # qui est une ligne de commentaire, aucune des deux n'est exécutée par bash. L'inversion de la correspondance se traduit par des lignes qui ne sont ni des lignes vides ni des lignes de commentaire.

$tDB est une variable qui stocke la valeur du fichier de zone locale.

En mettant tout cela ensemble, les mauvaises adresses IP (adresses IP à bloquer) sont stockées dans BADIPS qui stocke les valeurs des mauvaises adresses IP obtenues à partir d'une liste de fichiers de zone locale.

Karel
la source