it-swarm.com.de

Linux-Bash-Skript zum Extrahieren der IP-Adresse

Ich möchte ein großes Skript auf meinem Debian 7.3 erstellen (so etwas wie übersetzt und viel benutzerfreundlicher). Ich habe ein Problem. Ich möchte nur einige der Informationen verwenden, die mir Befehle geben. Zum Beispiel sieht meine ifconfig so aus:

eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0  
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1309425 (1.2 MiB)  T

Ich möchte nur die IP-Adresse in der folgenden Zeile anzeigen: echo "Ihre IP-Adresse lautet: (IP_ADDRESS)". Gibt es einen Befehl, mit dem ich so etwas tun kann, um im Stream nach Informationen zu suchen, die ich erhalten möchte? Ich kenne grep und sed, aber ich bin nicht wirklich gut mit ihnen.

Edit: Zunächst einmal danke, dass du mir bei diesem Problem geholfen hast, jetzt weiß ich viel mehr. Zweitens ist das Projekt in Bearbeitung. Wenn sich jemand dafür interessieren würde, melde ich mich einfach.

35
user3232381

So erhalten Sie einfach Ihre IP-Adresse:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

Dies gibt Ihnen die IP-Adresse von eth0.

Bearbeiten: Aufgrund von Namensänderungen der Benutzeroberflächen in neueren Versionen von Ubuntu funktioniert dies nicht mehr. Stattdessen können Sie einfach Folgendes verwenden:

hostname --all-ip-addresses oder hostname -I, der dasselbe macht (gibt ALLE IP-Adressen des Hosts an).

35
Marco Hegenberg

Wenn das Ziel ist, die IP-Adresse zu finden verbunden in Richtung Internet, dann sollte dies eine gute Lösung sein.


AKTUALISIEREN!!! Mit der neuen Linux-Version erhalten Sie weitere Informationen auf der Linie:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache

um die IP zu erhalten, müssen Sie die IP nach src suchen

ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
10.36.15.150

und wenn Sie den Schnittstellennamen mögen

ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ens192

ip route Öffnet keine Verbindung, sondern zeigt nur die Route an, die benötigt wird, um zu 8.8.8.8 Zu gelangen. 8.8.8.8 Ist Googles DNS.

Wenn Sie dies in einer Variablen speichern möchten, gehen Sie wie folgt vor:

my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')

Warum kann eine andere Lösung fehlschlagen:

ifconfig eth0

  • Wenn die Schnittstelle, die Sie haben, einen anderen Namen hat (eno1, wifi, venet0 usw.)
  • Wenn Sie mehr als eine Schnittstelle haben
  • Die IP-Verbindungsrichtung ist nicht die erste in einer Liste mit mehr als einer IF

Hostname -I

  • Kann nur die 127.0.1.1 bekommen
  • Funktioniert nicht auf allen Systemen.
81
Jotne

Wenn Sie eine durch Leerzeichen getrennte Liste Ihrer IP-Adressen erhalten möchten, können Sie den Befehl hostname mit dem Befehl --all-ip-addresses (kurz -I) Flagge

hostname -I

wie hier beschrieben: IP-Adresse in Bash-Variable einfügen. Gibt es einen besseren Weg ?

35
user000001
ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"
7
John

Dies ist möglicherweise nicht in allen Fällen hilfreich (insbesondere, wenn Sie über mehrere Netzwerkkarten verfügen):

hostname -I | awk '{ print $1 }'
5
Pavel
  /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
4
ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'
4
fastrizwaan

Treffen Sie Ihre Wahl:

$ cat file
eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1309425 (1.2 MiB)  T

$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103

$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103
4
Ed Morton

Nur eine Anmerkung, da ich nur einige Zeit damit verbracht habe, ein fehlerhaftes Upgrade auf einem Server zu beheben. Es stellte sich heraus, dass ich vor (Jahren) einen Test implementiert hatte, um festzustellen, ob dynamisch hinzugefügte Schnittstellen (z. B. eth0: 1) vorhanden waren, und in diesem Fall bestimmte Programme an die 'Haupt'-IP von eth0 zu binden. Grundsätzlich handelte es sich um eine Variante der Lösung 'ifconfig | grep ... | sed ...' (plus Überprüfung auf 'eth0:' - Präsenz).
Das Upgrade brachte neue Net-Tools mit sich und die Ausgabe hat sich leicht verändert:

altes ifconfig:

eth0      Link encap:Ethernet  HWaddr 42:01:0A:F0:B0:1D
          inet addr:10.240.176.29  Bcast:10.240.176.29  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          ...<SNIP>

in der neuen Version wird dies angezeigt:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
      inet 10.240.212.165  netmask 255.255.255.255  broadcast 10.240.212.165
      ...<SNIP>

rendern der Suche nach 'eth0:' sowie 'inet addr:' ist fehlgeschlagen (egal ob 'em0', 'br0' oder 'wlan0' ...). Sicher, Sie könnten nach 'inet' (oder 'inet6') suchen und den addr: -Teil optional machen, aber bei näherer Betrachtung werden Sie feststellen, dass sich mehr oder weniger alles geändert hat: 'Mask' ist jetzt 'netmask', .. .

Der Vorschlag 'ip route ...' ist ziemlich geschickt - also vielleicht:

_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
    _MyIPs="$( hostname -I )"
    for _MyIP in "$_MyIPs"
    do
        echo "Found IP: \"$_MyIP\""
    done
else
    echo "Found IP: $_MyIP"
fi

Na ja, sowas sowieso. Da alle vorgeschlagenen Lösungen anscheinend fehlerhafte Umstände aufweisen, prüfen Sie, ob mögliche Edge-Fälle vorliegen - no eth, multiple eth's & lo's, wann 'hostname -i' fehlschlagen würde, ... und entscheiden Sie sich dann für die beste Lösung Zweitbester.

Prost und Bier!

2
Kevin

Eine geringfügige Änderung zu einem der vorherigen ip route ... Lösungen, bei denen kein grep erforderlich ist:

ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'
0
Doug R.

Meiner Meinung nach ist dies der einfachste und eleganteste Weg, um das zu erreichen, was Sie brauchen:

ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7

ip route get [Host] - gibt Ihnen das Gateway an, über das Sie einen Remote-Host erreichen können, z.

8.8.8.8 via 192.168.0.1 dev enp0s3  src 192.168.0.109

tr -s ' ' - Entfernt alle zusätzlichen Leerzeichen. Jetzt haben Sie die Einheitlichkeit, z.

8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109

cut -d' ' -f7 - schneidet die Zeichenfolge in durch Leerzeichen getrennte Felder ab und wählt dann das Feld Nr. 7 aus, z.

192.168.0.109
0
leonarth
awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103
0
Claes Wikner