2016-03-28 5 views
0

Ich habe ein einfaches Skript, das aus einer Liste von IP-Adressen nmaps, und gibt alle ips, die Port 80 geöffnet haben. Das Problem ist, wenn 80 geschlossen ist, und keine Rückkehr, ich bekomme "=: Befehl nicht gefunden", da es versucht, eine leere/leere Variable zu vergleichen.Bash Vergleiche mit leeren Variablen in einfachen nmap Skript

#!/bin/bash 
for i in$(cat filename.txt); do 
str=$(nmap $i |grep 80 | cut -d ' ' -f2) 
    if($str = "open"); then 
    echo port 80 on $i is open 
    fi 
done 

Wenn Port 80 geschlossen ist, wird $ str nichts für einen Wert bekommen, dann, wenn ich versuche, nichts mit dem String „offen“ zu vergleichen, im immer „=: Befehl nicht gefunden“. Wie überprüfe ich, ob $ str einen Wert hat, bevor es mit einem String verglichen wird? Ich habe versucht,

if (! -z $str); then 

die ich dachte,

bedeutete
if $str is not null, then, 

aber konnte es nicht richtig funktioniert. Ich glaube sicherlich, ich verstehe, warum es sich so verhält, wie es ist, ich weiß einfach nicht, wie ich es korrigieren soll.

+1

Ihnen bewusst, dass der Testbefehl nicht '(' in der Schale ist? Sind Sie sich bewusst, dass weiße Raum Angelegenheiten und 'in $ (cat)' nicht funktionieren? Und weder 'if ('. – Jens

+0

Ich schlage vor, 'if ($ str =" open ");' durch 'if [[$ str =" open "]];'. – Cyrus

+0

zu ersetzen. Jens - in $ (cat) funktioniert definitiv. für i in $ (cat file.txt); echo $ i funktioniert -Cyrus Ich bekomme nicht mehr den "Befehl nicht gefunden", aber jetzt bekomme ich kein Echo mehr, wenn der Port geöffnet ist – johnnystetson

Antwort

1

Mit GNU bash:

#!/bin/bash 

port="80" 

while read -r host; do 
    str=$(nmap "$host" -p "$port" | grep "^$port") 
    ret="${PIPESTATUS[0]}" # returncode of nmap 

    if [[ $ret != 0 ]]; then 
    echo "error" 
    exit 1 
    fi 

    # check if $str contains "open" 
    if [[ $str =~ open ]]; then 
    echo "port $port on $host is open" 
    else 
    echo "port $port on $host is not open" 
    fi 
done <filename.txt 

Ich gehe davon aus filename.txt pro Zeile nur eine IP-Adresse oder den Hostnamen enthält.

Ausgabe (Beispiel):

 
port 80 on 10.20.30.40 is not open 
port 80 on localhost is open 
1

Hier ist eine Version mit Exit-Status des netcat:

#!/bin/bash 

while read host; do 
    nc -zw2 $host 80 &>/dev/null && state=open || state=closed 
    echo "port 80 on $host is $state" 
done < filename.txt 
-1

Vielen Dank für die Hilfe, Cyrus ich Sie gerne viel besser als das, was ich kam mit, und Cole war ich sehr froh, dass es mit netcat fertig ist. Hier ist, was ich schließlich bei

angekommen
#!/bin/bash 
for i in$(cat targetlist.txt); do --multiple people say this doesnt work 
str=$(nmap -p 80 $i | grep 80 | cut -d ' ' -f2) --im using bash 4.2.37(1) 
if [[ ! -z $str && $str = "open" ]] ; then 
echo port 80 on $i is open 
fi 
done