it-swarm.com.de

Durchsuchen Sie ifconfig, um nur meine IP-Adresse über Bash zu erhalten

Ich möchte die bashrc-Datei bearbeiten, um eine einfache Funktion namens "myip" auszuführen. Wie Sie sich vorstellen können, gibt die Funktion myip nur meine interne IP-Adresse meines Rechners aus.

Soweit ich gearbeitet habe, ist dies das Skript:

ifconfig en1 | awk '{ print $2}' | sort

Welcher hat meine Ausgabe bekommen:

10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active

Ich arbeite an Mac OS X.

Wie kann ich das schaffen?

14
Fernando Retimo

Nach stundenlangem Kampf habe ich es endlich richtig verstanden:

ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

Der letzte Teil, den ich vermisst hatte, ist nur ein Muster von IP-Adressen von meiner Liste.

8
Fernando Retimo

Die folgenden Arbeiten funktionieren hier (CentOS 5).

ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'

ifconfig eth0 | awk '/inet addr/ {gsub("addr:", "", $2); print $2}'

Für OS X ( v10.11 (El Capitan) mindestens):

ifconfig en0 | awk '$1 == "inet" {print $2}'
22
Etan Reisner

Dies ist die eher "agnostic" - Methode, um die IP-Adresse unabhängig von Ihrem * nix-System (Mac OS, Linux), dem Namen der Schnittstelle und sogar Ihrer Locale-Konfiguration abzurufen:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:

Wenn Sie mehr als eine aktive IP-Adresse haben, wird jede in einer separaten Zeile aufgeführt. Wenn Sie nur die erste IP-Adresse wünschen, fügen Sie dem Ausdruck | head -n1 hinzu:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
     | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

Wenn Sie die IP-Adresse einer bestimmten Schnittstelle wünschen, ersetzen Sie den ersten Ausdruck ifconfig durch ifconfig INTERFACENAME, beispielsweise ifconfig eth0 | grep -E ....

Dies sind einige auf dieser Seite erwähnte Beispiele, die unter bestimmten Umständen fehlschlagen und warum:

  • ip route ...: Der Befehl ip ist auf OSX-Maschinen nicht installiert.
  • hostname -I: Die -I-Option ist in OSX ungültig.
  • ifconfig en0 ...: Die Schnittstellennamen (eth0, en0) unterscheiden sich in Linux und OSX. In Linux hängt der Name auch vom Schnittstellentyp ab (ethX für Ethernet-Verbindung, wlanX für drahtlose Verbindungen usw.).
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))': Dies hat mir 127.0.1.1 (eine loopback IP) in Ubuntu Linux 14.04 beschert, funktioniert also nicht.
  • ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ': Der Post des Geographen ist der engere, funktioniert jedoch in einigen Linux-Distributionen nicht, wenn LANG=en nicht konfiguriert ist, da der Text inet addr:, nach dem grep sucht, in anderen Sprachumgebungen mit einem anderen Text ausgegeben wird .
14
Mariano Ruiz

Im Falle von eth0 funktioniert das Folgende für mich. Versuchen Sie es mit derselben Logik zu optimieren.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'  
12
JSR

Sie können awk verwenden, um sowohl die Auswahl der inet-Zeile als auch die Analyse der IP-Adresse wie folgt vorzunehmen:

$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1

Ersetzen Sie im obigen Beispiel eth0 durch den Geräte-Handle docker0. Wenn Sie eine reine AWK -Implementierung wünschen, können Sie das "Schneiden" wie folgt ausführen:

$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
7
slm

Es gibt eine andere einfache Möglichkeit, die IP-Adresse abzurufen, wenn nicht nur ifconfig analysiert wird.

hostname -I -I, --all-ip-addresses all addresses for the Host -i, --ip-address addresses for the hostname

Ref: http://linux.die.net/man/1/hostname

Beispiel:

[ec2-user @ terraform ~] $ hostname -I
10.10.10.10

3
Baskar

IPv4-Beispiele mit BASH4 +

Beispiel 1 , mit Hostname:

  hostname -I|cut -d" " -f 1

Beispiel 2, das Gerät ist bekannt (und ändert sich nie):

  ifconfig ens5 | grep "inet" | awk '{print $2}' |  sed 's/[^0-9.]*//g'

Beispiel 3 , nicht jetzt das Gerät (z. B. eth0, eth1, enp0s23 oder wpxxx):

 ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF "  IP: "$2}'

Beispiel 4 , möchte die Netzwerk-IP-Adresse:

 wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1

genießen.

3
Mike Q

Es ist nicht notwendig, eine nicht portierbare ifconfig-Analyse in Bash durchzuführen. Es ist ein trivialer Einzeiler in Python:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
2
John Zwinck

Wenn Sie nur "inet" und nicht "inet6" suchen, funktioniert das für mich:

/usr/bin/ifconfig eth0 | grep --Word-regexp inet | awk '{print $2}'

"--Word-regexp" bewirkt, dass grep nach dem gesamten Wort "inet" sucht und nicht mit Wortteilen übereinstimmt, dh "inet" stimmt nicht mit "inet6" überein - "inet" passt nur zu Zeilen mit "inet" .

1
Jonathan Le

Sie können dies auch versuchen

[email protected]:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
[email protected]:~$ 

Ausgabe

[email protected]:~$ ./script.sh
192.168.1.1
10.0.1.1
[email protected]:~$

Bitte beachten Sie, dass die Ausgabe von ifconfig abhängig von Ihrer Linux-Version unterschiedlich sein kann. Daher möchten Sie möglicherweise das Skript entsprechend ändern.

Übrigens, das ist meine ifconfig-Ausgabe

[email protected]:~$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:10  
          inet addr:192.168.1.1  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14616 (14.2 KiB)  TX bytes:17776 (17.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:00:00:00:00:11
          inet addr:10.0.1.1  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[email protected]:~$
1

Das funktioniert bei mir:
ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

0
user3396065

Benutzen:

ifconfig enops3 | greb broadcast | cut -d " " -f10

Dabei ist enops3 der Name der Schnittstelle.

0

Dieser Code gibt IP-Adressen für alle Netzwerkverbindungen aus (außer Loopback) und ist portabel zwischen most OS X- und Linux-Versionen .

Dies ist besonders nützlich für Skripts, die auf Computern ausgeführt werden, auf denen:

  • Der aktive Netzwerkadapter ist unbekannt.
  • notebooks, die zwischen WLAN- und Ethernet-Verbindungen wechseln, und
  • maschinen mit mehreren Netzwerkverbindungen.

Das Skript lautet:

/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2

Dies kann einer Variablen in einem Skript folgendermaßen zugewiesen werden:

myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)

Skripts können mit mehreren möglichen Adressen umgehen, indem sie die Ergebnisse mithilfe einer Schleife verarbeiten:

if [[ -n $myip ]]; then
  count=0
  for i in $myip; do
    myips[count]=$i       # Or process as desired
    ((++count))
  done
  numIPaddresses=$count   # Optional parameter, if wanted
fi

Anmerkungen:

  • Es filtert "ifconfig" nach "cast", da dies die Loopback-Adressen herausfiltert und gleichzeitig mit den meisten OS X- und Linux-Versionen funktioniert.
  • Die abschließende 'Cut'-Funktion ist für die ordnungsgemäße Funktion unter Linux erforderlich, nicht jedoch für OS X. Sie hat jedoch keine Auswirkungen auf die OS X-Ergebnisse. Daher bleibt sie für die Portabilität.
0
azrobbo

Ähnlich wie JSR, jedoch mit awk und cut in umgekehrter Reihenfolge:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
0
Arun

Code auch für VDS/VPS:

ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1

oder

ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
0
Geograph

Nachdem ich einige Lösungen ausprobiert habe, finde ich dies am praktischsten. Fügen Sie dies Ihrem Alias ​​hinzu:

alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'

die Ausgabe sieht folgendermaßen aus:

[email protected]:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255 

0
Shadycorp

Nehmen Sie Patch's Antwort, um es etwas allgemeiner zu machen,

d. h .: alles bis zur ersten Ziffer überspringen.

ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'

Oder noch besser:

ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'

  • Bitte beachten Sie, dass sich der Ausdruck Teil am Ende von $ 2 zu $ 1 ändert.

Perl Regex verwenden:

ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'

Erläuterung: grep -oP sucht mit Perl-Regex nach einer EXAKT-Übereinstimmung.
Der "knifflige" Teil ist der Regex selbst;
1. (?<= inet addr:) bedeutet - dass der String inet addr: ist links von dem, wonach wir suchen.
2. [^ ]+ (Bitte beachten Sie das Leerzeichen nach dem ^) - es bedeutet, dass Sie bis zum ersten Leerzeichen nach allem suchen müssen - in unserem Fall ist es die IP-Adresse.

0
AK75