ubuntuusers.de

script zum herausfinden der IP vom Host gesucht

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Sonie

Avatar von Sonie

Anmeldungsdatum:
1. Mai 2012

Beiträge: 135

Wohnort: Höchst im Odenwald

ich suche ein script, welches mit die IP´s eines Host aus einer Datei ausliest, dabei aber bestimmte Bereiche filtert.

im augenblick sieht das so aus:

# system_ip=$(grep $HOSTNAME /etc/hosts|tr '\t' ' '|cut -d' ' -f1)
127.0.0.2
172.27.0.199

die 127.x.x.x soll aber nicht übergeben werden....

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

Sonie schrieb:

ich suche ein script, welches mit die IP´s eines Host aus einer Datei ausliest, dabei aber bestimmte Bereiche filtert.

im augenblick sieht das so aus:

# system_ip=$(grep $HOSTNAME /etc/hosts|tr '\t' ' '|cut -d' ' -f1| grep -v '^127')
127.0.0.2
172.27.0.199

die 127.x.x.x soll aber nicht übergeben werden....

Am Ende einfach ausfiltern, siehe markierte Ergänzung.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Nutze die entsprechenden Shell-Tools:

$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 64:51:06:30:9c:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.97/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6651:6ff:fe30:9cbe/64 scope link 
       valid_lft forever preferred_lft forever
3: vboxnet0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff

Das kannst du auch auf das Device und nach IPs greppen:

$ ip address show dev eth0 | grep inet | awk '{ print $2 }'
192.168.0.97/24
fe80::6651:6ff:fe30:9cbe/64

Die Hosts-Datei hat nichts mit den auf dem System konfigurierten IPs zu tun.

Sonie

(Themenstarter)
Avatar von Sonie

Anmeldungsdatum:
1. Mai 2012

Beiträge: 135

Wohnort: Höchst im Odenwald

misterunknown schrieb:

Nutze die entsprechenden Shell-Tools:

Die Hosts-Datei hat nichts mit den auf dem System konfigurierten IPs zu tun.

die ip sind doch gar nicht auf dem entsprechenden interface gebunden. die stehen natürlich in der hosts drinnen. ich hab als Parameter nur den $Hostname

Sonie

(Themenstarter)
Avatar von Sonie

Anmeldungsdatum:
1. Mai 2012

Beiträge: 135

Wohnort: Höchst im Odenwald

radoe2 schrieb:

# system_ip=$(grep $HOSTNAME /etc/hosts|tr '\t' ' '|cut -d' ' -f1| grep -v '^127')

Am Ende einfach ausfiltern, siehe markierte Ergänzung.

danke ! Past perfekt!

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Sonie schrieb:

die ip sind doch gar nicht auf dem entsprechenden interface gebunden. die stehen natürlich in der hosts drinnen. ich hab als Parameter nur den $Hostname

Ok, das hatte ich falsch verstanden. Ich dachte die gebundenen IPs wären gemeint.

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14347

Sonie schrieb:

... Past perfekt!

BTW: Ist die Ausgabe von:

hostname -i

oder von:

hostname -I

, dann nicht auch die gesuchte IP-Adresse?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

lubux schrieb:

hostname -I

Hallo!

Ja, vom aktuellen Rechner. In der hosts können aber diverse Rechner hinterlegt sein. Beispiel:

192.168.1.40   desktop
192.168.1.49   netbook
192.168.1.33   schleppi
192.168.1.46   ubutouch

grep desktop /etc/hosts | awk '{ print $1 }'
#ergibt
192.168.1.40

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14347

ChickenLipsRfun2eat schrieb:

lubux schrieb:

hostname -I

Hallo!

Ja, vom aktuellen Rechner. In der hosts können aber diverse Rechner hinterlegt sein.

Ja, das ist richtig, aber im 1. Beitrag wird ja nach dem Inhalt der $HOSTNAME-Variable u. a. auch gefiltert:

system_ip=$(grep $HOSTNAME /etc/hosts|tr '\t' ' '|cut -d' ' -f1)

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Stimmt. Ich hatte nur im Kopf "Variable". Aber ist ja ne Systemvariable. Dann wäre deine Lösung auf jeden Fall die bequemste ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Sonie schrieb:

radoe2 schrieb:

# system_ip=$(grep $HOSTNAME /etc/hosts|tr '\t' ' '|cut -d' ' -f1| grep -v '^127')

Am Ende einfach ausfiltern, siehe markierte Ergänzung.

danke ! Past perfekt!

Rein handwerklich sieht das etwas ungeschlacht aus. Mein Vorschlag, der im Prinzip das selbe macht:

1
system_ip=$(sed -n "/^127/d; s/\t$HOSTNAME$//p"  /etc/hosts )

(diese Version kann sogar die Hosts "Linux" und "Linux-2" (also Teilstrings) sauber auseinander halten !)

LG,

track

Sonie

(Themenstarter)
Avatar von Sonie

Anmeldungsdatum:
1. Mai 2012

Beiträge: 135

Wohnort: Höchst im Odenwald

Rein handwerklich sieht das etwas ungeschlacht aus. Mein Vorschlag, der im Prinzip das selbe macht:

1
system_ip=$(sed -n "/^127/d; s/\t$HOSTNAME$//p"  /etc/hosts )

(diese Version kann sogar die Hosts "Linux" und "Linux-2" (also Teilstrings) sauber auseinander halten !)

gibt bei mir kein Ergebnis... ☹

Bearbeitet von rklm:

Überzählige schließende }}} entfernt

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Sonie schrieb:

... gibt bei mir kein Ergebnis... ☹

Bei mir auch nicht. Aber das hat bei mir den Grund, dass ich dort nur einen Host habe, und der hat 127.0.1.1

Guck doch mal einfach, was er auswirft, wenn Du den 127-er Filter weglässt:

1
sed -n "  s/\t$HOSTNAME$//p"  /etc/hosts

Du musst natürlich so einen Filter immer scheibchenweise aufbauen und jeweils gucken was da raus kommt. Anders habe ich es ja auch nicht gemacht.

LG,

track

Sonie

(Themenstarter)
Avatar von Sonie

Anmeldungsdatum:
1. Mai 2012

Beiträge: 135

Wohnort: Höchst im Odenwald

Guck doch mal einfach, was er auswirft, wenn Du den 127-er Filter weglässt:

1
sed -n "  s/\t$HOSTNAME$//p"  /etc/hosts

Du musst natürlich so einen Filter immer scheibchenweise aufbauen und jeweils gucken was da raus kommt. Anders habe ich es ja auch nicht gemacht.

habe ich leider nicht erwähnt, natürlich habe ich die SED-Zeile durchprobiert - der 127^filter funktioniert, diese Zeile hier bringt kein Ergebnis.

ich vermute mal, es liegt am quoten - $hostname ist ja eine bashvariable...

   search='/^127/d;/'$HOSTNAME'/p'
   target_ip=$(sed -n $search /etc/hosts| awk '{ print $1 }')
   echo $target_ip

thanks for support.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Du veranstaltest auf der einen Seite eine etwas sinnlose 'Quoting'- Orgie, die nichts bringt (weil in dem '/^127/d;/' und dem '/p' wirklich nichts giftiges drin ist), aber auf der anderen Seite lässt Du die Verankerung ans Zeilenende weg, so dass er auch auf längere Strings matcht, die den Ausdruck enthalten.
Edit: ich korrigiere mich: das ";" muss man sehr wohl quoten oder escapen, damit die Shell es nicht interpretiert.

Verstehst Du, was ich meine ?

Du solltest diese 2 Punkte nachbessern:

search='/^127/d;'/$HOSTNAME$/p
target_ip=$(sed -n $search /etc/hosts | awk '{ print $1 }')
echo $target_ip

Aber im Grunde ist das awk gar nicht nötig, das kann sed auch alleine: siehe hier oben.

LG,

track

Antworten |