Wie erhalte ich die IP-Adresse mithilfe eines Shell-Skripts? [duplicate]

Diese Frage hat hier bereits Antworten :

Kommentare

  • Ist nicht ' t ifconfig -a wonach Sie ' suchen?
  • @rajcoumar Ich verstehe nicht, warum die Verwendung einer privaten IP die Verwendung verbietet die Ausgabe von ifconfig -a. Tatsächlich bewirkt die Antwort, die Sie als akzeptiert markiert haben, genau das (verwendet nur ip anstelle von ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Antwort

Um alle IP-Adressen unabhängig vom Namen aufzulisten, versuchen Sie Folgendes:

ifconfig | perl -nle "s/dr:(\S+)/print $1/e" 

oder:

ifconfig | awk "/inet addr/{print substr($2,6)}" 

Geben Sie den Schnittstellennamen (z. B. eth0) direkt nach ifconfig an, wenn Sie nur die IP einer bestimmten Schnittstelle wünschen:

ifconfig eth0 | perl -nle "s/dr:(\S+)/print $1/e" 

oder:

ifconfig eth0 | awk "/inet addr/{print substr($2,6)}" 

Kommentare

  • danke, das ist meine Ausgabe 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, Jetzt möchte ich 10.192.1.218 nehmen und in eine neue Variable im Shell-Skript zuweisen. Wie können wir das machen?
  • das würde nur die IP-Adressen anzeigen. Es wäre besser, wenn die entsprechenden Schnittstellennamen wie eth0, eth1, … werden ebenfalls angezeigt. 🙂
  • Verwenden Sie unbedingt die Routing-Tabellen, wie @ymattw vorschlägt! Dies hat die wunderbare Eigenschaft, genau die Adresse zurückzugeben, über die Ihr Computer so konfiguriert ist, dass er mit der angegebenen Adresse spricht. Ich denke, Sie möchten wahrscheinlich, dass awk '{print $NF; exit}' das letzte Feld (Quelladresse) der ersten Zeile erhält.
  • Vielen Dank für den Hinweis, sieht aus wie mein letztes Die Bearbeitung wurde nicht ' gespeichert. Interessant, ich konnte ' meine eigene Antwort nicht bearbeiten, also poste einfach neu: ip route get 1.1.1.1 | awk '{print $NF; exit} # dies erhalte die IP der Schnittstelle, die erreicht werden kann außerhalb

Antwort

Sie können Folgendes tun:

ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"

gibt die erste private IP-Adresse an, die in ip addr aufgeführt ist.

Zum Beispiel mit ip addr erhalte ich:

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: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:76:de:c1:f1 brd ff:ff:ff:ff:ff:ff inet 192.168.0.85/24 brd 192.168.0.255 scope global dynamic em1 valid_lft 42505sec preferred_lft 42505sec inet6 fe80::216:76ff:fede:c1f1/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500 link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff 

Mit der vorherigen Befehlszeile erhalte ich 192.168.0.85 Dies ist die IP-Adresse von em1.

Um sie in eine Variable in einem Shell-Skript einzufügen, können Sie var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Bis zum Ende des Skripts hat $var den Wert der IP-Adresse.

Kommentare

  • Und tatsächlich ist ' unix.stackexchange.com/questions/8518/ . Ich habe vor dem Posten nicht nach Duplikaten gesucht …
  • ip addr | grep ' Zustand UP ' -A2 | Schwanz -n1 | awk ' {print $ 2} ' | cut -f1 -d ' / ' Mit diesem Befehl habe ich eine private Adresse erhalten. Jetzt möchte ich die Ausgabe einer Variablen zuweisen.
  • @rajcoumar Ich habe die Antwort aktualisiert. Beachten Sie, dass diese Frage auf dieser Site bereits gestellt und beantwortet wurde. Weitere Informationen finden Sie unter unix.stackexchange.com/questions/4569/… .
  • Hinweis auch, dass meine Antwort nicht die eleganteste ist. Möglicherweise gibt es einen besseren Weg, dies zu tun, als die Ausgabe von ip addr zu analysieren.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' Dies funktioniert auch. übrigens

Antwort

Flagrant Copy Paste aus Stackoverflow , da wir nicht über Websites hinweg betrügen können. Ich weiß, dass es nicht Bash oder Sh ist, aber wer hat zu diesem Zeitpunkt noch kein Python installiert?

Sie sollten netifaces . Es ist plattformübergreifend für Mac   OS   konzipiert X, Linux und Windows.

>>> import netifaces as ni >>> ni.interfaces() ["lo", "eth0", "eth1", "vboxnet0", "dummy1"] >>> ni.ifaddresses("eth0") {17: [{"broadcast": "ff:ff:ff:ff:ff:ff", "addr": "00:02:55:7b:b2:f6"}], 2: [{"broadcast": "24.19.161.7", "netmask": "255.255.255.248", "addr": "24.19.161.6"}], 10: [{"netmask": "ffff:ffff:ffff:ffff::", "addr": "fe80::202:55ff:fe7b:b2f6%eth0"}]} >>> >>> ni.ifaddresses.__doc__ "Obtain information about the specified network interface.\n\nReturns a dict whose keys are equal to the address family constants,\ne.g. netifaces.AF_INET, and whose values are a list of addresses in\nthat family that are attached to the network interface." >>> # for the IPv4 address of eth0 >>> ni.ifaddresses("eth0")[2][0]["addr"] "24.19.161.6" 

Die zum Indizieren von Protokollen verwendeten Nummern stammen von /usr/include/linux/socket.h (unter Linux) …

#define AF_INET 2 /* Internet IP Protocol */ #define AF_INET6 10 /* IP version 6 */ #define AF_PACKET 17 /* Packet family */ 

Kopieren und Einfügen beenden

Wenn Sie nur die IP von up und möchten ausgehende Schnittstelle, dies funktioniert.

Noch eine andere Option, wenn Sie nur über Schnittstellen aufzählen möchten, da niemand in der Lage zu sein scheint, zu unterbieten und genau das, was Sie wollen:

import netifaces as ni ints = ni.interfaces() for i in ints: if "eth" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass elif "wlan" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass 

Kommentare

  • Beachten Sie, dass das OP dies in seiner Frage angegeben hat ' weiß nicht im Voraus, welche Schnittstelle UP ist.Er möchte nur die IP-Adresse der Schnittstelle im Status " up ", ohne zu wissen, um welche es sich handelt.
  • Dann ' wird nur die lokale Adresse von einem offenen Socket an Google gesendet. So wie ich es gelesen habe, wollte er alle Schnittstellen aufzählen und IPs Schnittstellen zuordnen, anstatt nur einen Socket zu öffnen und nach der lokalen IP zu suchen.
  • Es wurde ein einfaches Skript hinzugefügt, um die " Geben Sie mir einfach das ausgehende IP-Problem ".
  • Er tut ' t nicht möchte seine externe Adresse, aber seine private Adresse. So wie ich es verstehe, könnte er über jede seiner Schnittstellen mit einem privaten Netzwerk verbunden sein und möchte nur seine private IP-Adresse kennen, ohne zu wissen, welche Schnittstelle verwendet wird.
  • Die private Adresse wird weiterhin von angegeben Im zweiten Skript ist ' nur die ausgehende private Adresse.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.