
Bei einem Array von Domänen möchte ich deren IP-Adressen im folgenden Format erhalten:
98.139.183.24
98.137.236.24
Dieses Skript
#!/bin/bash
domains=(yahoo.com yahoo.ca)
printf "%s\0" "${domains[@]}" | xargs -0 -t -n 1 ping -c 1 -w 3 | grep -E 'PING.*' | sed -r 's:^.*\((([0-9]{1,3}\.){3}[0-9]{1,3})\).*$:\1:'
gibt die erwartete Ausgabe. Aber zunächst habe ich Folgendes versucht:
printf "%s\0" "${domains[@]}" | xargs -0 -t -n 1 ping -c 1 -w 3 | head -n 1 | sed -r 's:^.*\((([0-9]{1,3}\.){3}[0-9]{1,3})\).*$:\1:'
und der Befehl wurde mit einem Signal 13 beendet (was, soweit ich weiß, Rohrbruch bedeutet?!?). Offensichtlich liegt das Problem bei head
. Jetzt möchte ich untersuchen, warum es nicht funktioniert und ob und ggf. wie ich dieses lange „Wiener Würstchen“ mit zum Laufen bringen könnte head
. Ich habe es noch nicht ausprobiert, bin mir aber ziemlich sicher, dass es mit einer for
Konstruktion und Verwendung von head
für jedes funktionieren würde ping
. Die Verwendung xargs
mit der -P
Option funktioniert auch nicht. Ich denke, das Hauptproblem wäre, dass die Ausgabe als eine zusammenhängende Datei head
ausgegeben wird xargs
(habe ich es richtig gesagt oder ist es „Eingabe“?).
EDIT1: Mein Ziel war es, die IP-Adressen einer Reihe von Website-Adressen zu erhalten und dann zu prüfen, bei welchen Organisationen diese IPs registriert sind, indem ich whois
die Ausgabe verwende und weiterleite sed
und dann vielleicht eine Gruppierung vornehme, damit ich nur eindeutige Namen habe, keine Wiederholungen. Ich stimme zu, dass dig
oder host
viel gründlicher sind als , aber ich bin ziemlich sicher, dass die Websites klein genug sind, dass nur eine IP-Adresse für jede Domäne gefunden wird. Trotzdem denke ich, dass ich jetzt ( oder ; ich habe mich noch nicht entschieden) ping
verwenden werde, wie andere vorgeschlagen haben.dig
host
Um klarzustellen, warum ich daran interessiert bin, es zu verwenden head
und nicht, grep
was ich brauche: Ich bin einfach neugierig, wie es gemacht wird (ich bin ziemlich neu bei Bash und Linux im Allgemeinen) und ich hatte das Gefühl, dass es vielleicht aufklären könnte, wie Piping funktioniert. Das ist alles
Antwort1
head -n 1
beendet sich, nachdem die erste Zeile gedruckt wurde, und sendet SIGPIPE an den Writer ( xargs
), um mitzuteilen, dass kein Prozess mehr vorhanden ist, der das Geschriebene lesen kann. Als Reaktion darauf xargs
tut es, was die meisten Prozesse tun, und beendet seine Unterprozesse ( ping
), gibt eine Warnung aus, sendet wahrscheinlich SIGPIPE an seinen eigenen übergeordneten Prozess und beendet sich dann selbst.
Sie werden jedoch feststellen, dass pipefail
der Exit-Code des gesamten Skripts Null ist, da Sie dies in Ihrem Skript nicht festgelegt haben – der Exit-Code des sed
Befehls.
Antwort2
echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1
oder mit grep, nur Nicht-Ping-Knoten anzeigen
echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1|grep -b1 100