Was bedeuten ^ $ und ^ #?

17

Das verstehe ich nicht BADIPS=$(egrep -v "^#|^$" $tDB). Kannst du es erklären? vollständiger Code:

#!/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
quelle
1
Alternativ grep grep '^[^#]'dieser Regex sollte am Anfang mindestens ein Zeichen erwarten, aber es sollte kein#
Avinash Raj

Antworten:

31

^ist das Sonderzeichen eines regulären Ausdrucks, das zum Markieren des Zeilenanfangs und $des Zeilenendes verwendet wird. Sie werden verwendet, um den Ausdruck an diesen Punkten zu verankern . Beginnt ^#also jede Zeile mit #und ^$ist eine leere Zeile (da zwischen Anfang und Ende nichts steht).

-vin grepnegiert die Übereinstimmung, daher sucht dieser Befehl nach Zeilen, die nicht auskommentiert (nicht mit #) oder leer sind.

muru
quelle
15

egrep Sucht nach Dateien, die einem Muster entsprechen.

Die -v (oder --invert-match) Option von egrep kehrt den Übereinstimmungssinn um, um nicht übereinstimmende Linien auszuwählen.

"^#|^$"Wertet entweder eine leere Zeile oder eine Zeile aus, die mit einem # beginnt, einer Kommentarzeile, die von bash nicht ausgeführt wird. Das Invertieren der Übereinstimmung ergibt Zeilen, die weder Leerzeilen noch Kommentarzeilen sind.

$tDB ist eine Variable, die den Wert der lokalen Zonendatei speichert.

Alles in allem werden die fehlerhaften IPs (zu blockierende IPs) in BADIPS gespeichert, in dem die Werte fehlerhafter IPs gespeichert werden, die aus einer Liste lokaler Zonendateien abgerufen wurden.

karel
quelle