ubuntuusers.de

Ping in Schleife schlägt fehl, aber Einzelbefehl geht

Status: Gelöst | Ubuntu-Version: Xubuntu 12.04 (Precise Pangolin)
Antworten |

xuniL123

Anmeldungsdatum:
5. August 2012

Beiträge: Zähle...

Hallo,

ich habe hier ein .txt-File, welches Rechnernamen enthält, Aufbau

rechnername1
rechnername2
rechnername3
...

Die Rechnernamen sind nur exemplarisch und spielen auch keine Rolle. Um zu testen, welche dieser Rechner noch am Netz hängen, will ich sie einfach der Reihe nach anpingen:

while read rechnername; do
echo $rechnername
ping -c1 $rechnername
done < Mappe1.txt

Ergebnis:

rechnername1
ping: unknown host rechnername1
rechnername2
ping: unknown host rechnername2
rechnername3
ping: unknown host rechnername3
...

Kann ja wohl nicht sein, dass kein einziger davon pingbar ist, dachte ich mir, editierte die Datei "Mappe1.txt" und setzte ganz ans Ende einen Rechnernamen, der auf jeden Fall gehen muss (meiner nämlich). Dummerweise:

...
mein_rechner
ping: unknown host mein_rechner

??? Manueller Test:

ping -c1 mein_rechner

Dann ist der Ping erfolgreich!?

Ich kann mir das nicht erklären. Woran könnte das liegen?

Danke.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Falls im Rechnernamen Leer- oder Sonderzeichen vorkommen (können): dann muss die Variable $rechnername immer "gequotet" werden. (sonst zerfällt sie in Einzelworte, bzw. die Sonderzeichen werden interpretiert !)

Ansonsten würde ich mal per Hexdump die Textdatei angucken, ob da nicht etwas drin steht, das da nicht rein gehört:
(beliebt sind Leerzeichen und Wagenrückläufe "\r")

hd Mappe1.txt

oder vielleicht reicht auch schon vernünftiges "Quoten" und einrahmen im Skript, um was zu sehen:

echo "[$rechnername]"

LG,

track

xuniL123

(Themenstarter)

Anmeldungsdatum:
5. August 2012

Beiträge: 293

Danke, das wars! Hinter jedem Rechnernamen war noch ein \n und \r versteckt. Mit

tr -d '\r' < Mappe1.txt > Mappe1.txt.neu

habe ich die \r raus bekommen und jetzt geht's 👍 .

Danke!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

xuniL123 schrieb:

Danke, das wars! Hinter jedem Rechnernamen war noch ein \n und \r versteckt. Mit

tr -d '\r' < Mappe1.txt > Mappe1.txt.neu

habe ich die \r raus bekommen und jetzt geht's 👍 .

Wieder einmal ein klassischer Fall für dos2unix...

Noch ein Tipp: da mein Arbeitsplatzrechner ein Windows-Rechner ist, ich aber ständig auch auf verschiedenen Unix-Maschinen arbeite, habe ich meine Editoren immer so eingestellt, dass sie einen Unix-Zeilenumbruch einfügen. Dann gibt es an der Stelle auch nie Stress. Man muss ja nicht gerade Notepad von Windows benutzen... 😛

Ciao

robert

xuniL123

(Themenstarter)

Anmeldungsdatum:
5. August 2012

Beiträge: 293

Danke für den Tipp!

Ich habe jetzt mal ein kleines Script drumherum gebastelt und es scheint zu funktionieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash

input="$1"
ok=0
unreachable=0
fail=0

output() {
    hostname=$1
    message=$2
    outfile="$3"
    echo "$hostname $message"
    echo $hostname >> "$outfile.$message"
}


while read rechnername; do
    ping -c1 $rechnername >/dev/null 2>/dev/null
    case $? in
        0)  output $rechnername "OK" "$input"
            ok=$((ok+1))
            ;;
        1)  output $rechnername "OK, but host unreachable" "$input"
            unreachable=$((unreachable+1))
            ;;
        *)  output $rechnername "fail" "$input"
            fail=$((fail+1))
            ;;
    esac
done < "$input"

echo -e "\n$((ok+unreachable+fail)) hosts | $ok OK | $unreachable unreachable | $fail fail"

Probelauf:

./hostscan.sh Mappe1.txt 
S022 fail
S023 OK, but host unreachable
S024 fail
S061 fail
S062 OK
S063 OK, but host unreachable
S064 OK, but host unreachable
S065 OK, but host unreachable
S066 fail
S1030 fail
S1032 fail
S1033 fail
S1036 fail
S1038 fail
S1039 fail
S1045 fail
S1053 fail
S1054 fail
S1055 fail
S1056 fail
S1057 fail
S1059 fail
S1067 fail
S1068 fail
S1069 fail
S1070 fail
S1071 fail
S1073 fail
S1076 fail
S1077 fail
S1079 fail
S1080 fail
S1083 fail
S1085 fail
S1086 fail
S1087 fail
S1090 fail
S1094 fail
S1096 fail
S1097 fail
S1100 OK, but host unreachable
S1101 fail
S1115 fail
S1119 fail
S1121 fail
S1122 fail
S1123 fail
S1124 fail
S1125 fail
S1126 fail
S1129 fail
S1134 fail
S1139 fail
S1140 fail
S1142 fail
S1146 fail
S1147 fail
S1150 fail
S1151 fail
S1154 fail
S1156 fail
S1158 fail
S1159 OK, but host unreachable
S1161 fail
S1163 fail
S1164 fail
S1172 fail
S1174 fail
S1176 fail
S1177 fail
S1179 fail
S1184 fail
s1185 OK, but host unreachable
S1186 fail
S1189 fail
S1192 fail
S1206 fail
S1210 fail
S1214 fail
S1218 fail
S1222 fail
S1223 fail
S1226 fail
S1229 fail
S1233 fail
S1242 fail
S1269 fail
S1278 fail
S2010W fail
s2125 fail
S2163 fail
S2164 fail
S2171 fail
S2186 fail
S2213 OK, but host unreachable
S3004W fail
S3007W fail
S3009W fail
S3012W fail
S3100W OK, but host unreachable
S3106W fail
S4001W fail
S4003W fail
S4004W fail
S4006W fail
S4007W fail
S4008W fail
S4009W fail
S4010W fail
S4011W fail
S4104W fail
S4106W fail
S4202W fail
S4203W fail
S4300W fail
S4302W fail
S4303W fail
S4307W fail
S4405W fail
S4407W fail
S4551W fail
S4559W fail
S4562W fail
S4575W fail
S5210W fail
S5222W fail
S5300W fail
S5600W fail
S5750W OK
S5950W OK
S6099W fail
S6666W fail
S7000 fail
S7004 fail
S7006w fail
S7009 fail
S7013 fail
S7014 fail
S7016 fail
S7026 fail
S7027 fail
S7123 fail
S7140 fail
S7141 fail
S7149 fail
S7159 fail
S7215 fail
S7218 fail
S7246 fail
S7269 fail
S7276 fail
S7280 fail
S7283 fail
S7301W fail
S7302W fail
S7305W OK, but host unreachable
S7306W fail
S7313W fail
S7500W OK
S8001W fail
S8125 fail
S8143 fail
S8144 fail
S8154 fail
S9529 fail
s9876 OK
S9998 fail

167 hosts | 5 OK | 10 unreachable | 152 fail
ls
hostscan.sh  hostscan.sh~  Mappe1.txt  Mappe1.txt.fail  Mappe1.txt.OK  Mappe1.txt.OK, but host unreachable

Das Ding scheint sogar zu funktionieren 😬

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

xuniL123 schrieb:

Das Ding scheint sogar zu funktionieren 😬

Du kannst Dir etwas Redundanz und damit Tipparbeit sparen, wenn Du den Inrekement-Operator benutzt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

input="$1"
ok=0
unreachable=0
fail=0

output() {
    hostname=$1
    message=$2
    outfile="$3"
    echo "$hostname $message"
    echo $hostname >> "$outfile.$message"
}


while read rechnername; do
    ping -c1 $rechnername >/dev/null 2>/dev/null
    case $? in
        0)  output $rechnername "OK" "$input"
            ((++ok))
            ;;
        1)  output $rechnername "OK, but host unreachable" "$input"
            ((++unreachable))
            ;;
        *)  output $rechnername "fail" "$input"
            ((++fail))
            ;;
    esac
done < "$input"

printf '%4d hosts\n%4d OK\n%4d unreachable\n%4d fail\n' \
  $((ok + unreachable + fail)) $ok $unreachable $fail

Außerdem habe ich mal eine alternative Ausgabe eingebaut - nur so.

Ciao

robert

xuniL123

(Themenstarter)

Anmeldungsdatum:
5. August 2012

Beiträge: 293

Ah, die bash kann ++variable in C-Manier? Wusste ich nicht!

printf ist ja vom Syntax her auch fast C. Ziemlich praktisch ☺

Danke und Gruß

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

xuniL123 schrieb:

Ah, die bash kann ++variable in C-Manier? Wusste ich nicht!

Die bash kann sogar

1
2
3
4
5
6
$ for ((i=0;i<5;++i)) do echo $i; done
0
1
2
3
4

printf ist ja vom Syntax her auch fast C. Ziemlich praktisch ☺

Jo.

Ciao

robert

Antworten |