Welcher Terminalbefehl soll nur IP-Adresse und sonst nichts bekommen?

117

Ich versuche, nur die IP-Adresse (inet) als Parameter in einem Skript zu verwenden, das ich geschrieben habe.

Gibt es in einem Unix-Terminal eine einfache Möglichkeit, nur die IP-Adresse abzurufen, anstatt sie durchzusehen ifconfig?

Mason
quelle
Ja, oder eine andere eindeutige Kennung für die Maschine, nehme ich an.
Mason
1
Sie erhalten eine ungültige Option für Hostname -i?
Ken
4
Hostname ist nicht so zuverlässig wie ifconfig
Joel
2
Joel hat recht, besonders Sie sprachen über MAC OS und dann über Ubuntu
Zackaryka
2
Beachten Sie beim Durchsuchen der folgenden Antworten, dass die Ausgabe von ip -o addressviel einfacher zu bearbeiten ist als die Ausgabe von ip address.
24.

Antworten:

177

Sie können ein Skript schreiben, das nur die IP zurückgibt, wie:

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

Für MAC:

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2

Oder für Linux-System

hostname -i | awk '{print $3}' # Ubuntu 

hostname -i # Debian
Buch des Zeus
quelle
4
hostname -iauf meinem kehrt es zurück:::1 127.0.1.1 192.168.1.100
Buch des Zeus
1
Auf Debian habe ich nur eine IP bekommen. Die Verwendung hostnameist also nicht portabel.
Timofey Stolbov
1
Es heißt, dass -i und -I beide illegale Optionen sind
Mason
3
Zusammenfassend: Die erste Methode hängt vom Adapter ab, der nicht immer gleich ist. Die zweite zeigt für mich zwei IP-Adressen und die letzten beiden funktionieren nicht auf dem Mac.
Matt
4
Wenn die Konfiguration hier veraltet und unzuverlässig ist, z. B. schlägt der Grep unter Debian 9 (Stretch) fehl, weil er nicht mehr "inet addr: 172.17.0.4" ausgibt, sondern nur "inet 172.17.0.4". Verwenden Sie stattdessen "ip", wie unter stackoverflow.com/a/26694162/72717 beschrieben .
Jamshid
60

Dadurch erhalten Sie alle IPv4-Schnittstellen, einschließlich des Loopbacks 127.0.0.1:

ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

Dies wird nur zeigen eth0:

ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

Und auf diese Weise können Sie IPv6-Adressen erhalten:

ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'

Nur eth0IPv6:

ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
SAM
quelle
Das grep -oPschlägt auf Busybox v1.24.1 fehl: ungültige Option - P
Pro Backup
1
grep ist nicht auf fast jedem Docker Conatiner für Prod installiert. Obwohl dies alles gute Befehle sind, sind sie für Container nicht nützlich :-(
AndyGee
1
Beste Antwort für meinen speziellen Fall. Sie müssen -Pfür reguläre Perl-Ausdrücke wechseln, sonst können wir das Lookbehind- (?<=inet\s)Token nicht verwenden . Sie können ein ähnliches Ergebnis erzielen, indem Sie ausführen grep -oe 'inet [0-9\.]\+'oder grep -oe 'inet6 [0-9a-f:]\+'aber auf diese Weise kann ich das erste Wort nicht loswerden. In SuSE- man grepBerichten ist dieses -PFlag experimentell.
Jorge Bellon
Dies ist die beste Antwort. ifconfig ist auf den meisten Betriebssystemen seit einigen Jahren veraltet.
pozcircuitboy
2
Eine kürzere Version des zweiten Befehls:ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
tukusejssirs
39

Im Allgemeinen kann niemals garantiert werden, dass ein System nur eine IP-Adresse hat. Sie können beispielsweise sowohl eine Ethernet- als auch eine WLAN-Verbindung haben. Wenn Sie eine aktive VPN-Verbindung haben, haben Sie eine weitere IP-Adresse.

Linux

Listet unter Linux hostname -Idie aktuelle (n) IP-Adresse (n) auf. Wenn Sie sich darauf verlassen, dass immer nur eine IP-Adresse zurückgegeben wird, funktioniert dies in einigen Szenarien höchstwahrscheinlich nicht wie erwartet (dh eine VPN-Verbindung ist hergestellt). Eine zuverlässigere Methode wäre daher, das Ergebnis in ein Array zu konvertieren und dann die Elemente zu durchlaufen:

ips=($(hostname -I))

for ip in "${ips[@]}"
do
    echo $ip
done

OSX

Wenn Sie unter OSX die Benutzeroberfläche kennen , können Sie Folgendes verwenden:

~$ ipconfig getifaddr en0
192.168.1.123

Dies gibt nur die IP-Adresse zurück.

Oder Sie können mögliche Schnittstellennamen durchlaufen, beginnend mit einem Suffix, dh en:

for NUMBER in $(seq 0 5); do
    ip=`ipconfig getifaddr en$NUMBER`
    if [ -n "$ip" ]; then
        myip="$ip"
        break
    fi
done

echo $myip

Das Abrufen der IP-Adresse wird auch nicht deterministisch, wenn sowohl Kabel- als auch WLAN-Verbindungen hergestellt werden, wenn ein Computer über mehr als eine Ethernet-Schnittstelle verfügt oder wenn VPN-Tunnel vorhanden sind.

Abrufen der externen IP

Wenn Sie die externe IP benötigen, können Sie einen Dienst im Textmodus abfragen, z. B. curl https://ipecho.net/plaineine externe IP im Nur-Text-Modus zurückgeben .

Ein noch schnellerer Weg, um die externe IP zu erhalten, besteht darin, einen bekannten DNS-Server abzufragen:

dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
ccpizza
quelle
Wie bekomme ich eine LAN-IP-Adresse?
DiEcho
16
hostname -I  

Dieser Befehl gibt Ihnen die genaue IP-Adresse, die Sie in Ubuntu möchten.

Vignajeth
quelle
Im Vergleich zu der Anzahl der bereits vorhandenen (und hoch bewerteten) Antworten glaube ich nicht, dass diese Antwort einen Mehrwert bringt ...
Mischa
4
auch auf Centos Hostname -I (Großbuchstabe i)
zzapper
1
das hat mir tatsächlich geholfen - das notierte Großbuchstaben 'i' war der Schlüssel
ChronoFish
2
Dies macht den Job perfekt, ohne zusätzliche Tools und ohne dass fünfzehn Binärdateien hintereinander aufgerufen werden müssen, um die Ausgabe zu bereinigen. Vielen Dank !
Ulrar
11

In den neuesten Ubuntu- Versionen ( 14.04 - 16.04 ) hat dieser Befehl den Trick für mich getan.

hostname -I | awk '{print $1}'
Da CodeKid
quelle
1
Auf der Handbuchseite: "[...] Diese Option listet alle konfigurierten Adressen auf allen Netzwerkschnittstellen auf. [...] Machen Sie keine Annahmen über die Reihenfolge der Ausgabe." Der letzte Satz sagt Ihnen, dass Sie print $1möglicherweise das richtige Ergebnis erhalten oder nicht.
0 0
7

Wenn Sie eine eingeschränkte Umgebung haben, können Sie diesen Befehl verwenden:

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
Caglar
quelle
3
Oder sogar:ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
Jose Alban
Ja, du hast recht. Aber seien Sie vorsichtig, wenn eth0 mehr als eine IP-Adresse hat, werden alle angezeigt.
Caglar
bash-4.4 # ip -4 addr show dev eth0 | grep inet | tr -s "" | cut -d "" -f3 | head -n 1 172.17.0.3/16 Also nicht gut mit dem / 16
AndyGee
Hinzufügen einer weiteren zur Schleife : ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1. Für v4 und v6:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
Sumit Murari
Wenn der Name der Schnittstelle nicht bekannt ist (oder sich zwischen den Plattformen unterscheidet), Sie aber nach der privaten IP-Adresse suchen, führen Sie stattdessen ip -4 addr show eth0 | grep inetip -4 addr show | grep 192
Folgendes aus
6

Um unter Mac OS X nur die IP-Adresse abzurufen , können Sie den folgenden Befehl eingeben:

ipconfig getifaddr en0
Tukan3
quelle
4

Der Befehl ifconfigist veraltet und Sie sollten den ipBefehl unter Linux verwenden.

Außerdem erhalten ip aSie einen Gültigkeitsbereich in derselben Zeile wie IP, sodass die Verwendung einfacher ist.

Dieser Befehl zeigt Ihnen Ihre globale (externe) IP:

ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'

Alle IPv4 (auch 127.0.0.1):

ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'

Alle IPv6 (auch :: 1):

ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'
Nux
quelle
4

Wir können einfach nur 2 Befehle (ifconfig + awk) verwenden, um genau die IP (v4) zu erhalten, die wir möchten:

eth0Führen Sie unter Linux den folgenden Befehl aus, vorausgesetzt, Sie erhalten die IP-Adresse von der Schnittstelle:

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

Führen Sie unter OSX en0den folgenden Befehl aus , um die IP-Adresse von der Schnittstelle abzurufen :

/sbin/ifconfig en0 | awk '/inet /{print $2}'

Fügen Sie diese Funktion hinzu, um unsere öffentliche / externe IP zu kennen ~/.bashrc

whatismyip () {
    curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}

Dann renne, whatismyip

zdk
quelle
3

Ich wollte etwas Einfaches, das als Bash-Alias ​​funktioniert. Ich fand, dass das hostname -Ifür mich am besten funktioniert (Hostname v3.15). Gibt hostname -iaus irgendeinem Grund die Loopback-IP zurück, hostname -Igibt mir jedoch die richtige IP für wlan0 und ohne die Ausgabe über grep oder awk weiterleiten zu müssen. Ein Nachteil ist, dass alle IPs hostname -Iausgegeben werden , wenn Sie mehr als eine haben.

Andy Forceno
quelle
3

So drucken Sie nur die IP-Adresse von eth0, ohne anderen Text:

ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'

Verwenden Sie Folgendes, um Ihre primäre Schnittstelle zu bestimmen (da sie möglicherweise nicht "eth0" ist):

route | grep ^default | sed "s/.* //"

Die beiden oben genannten Zeilen können wie folgt zu einem einzigen Befehl kombiniert werden:

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet )[\d.]+'
personal_cloud
quelle
2

Das würde den Trick in einem Mac machen:

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

Das löste sich ping 192.168.1.2in meiner Maschine auf.

Pro-Tipp : $(...)bedeutet, dass alles, was sich in den Klammern befindet, in einer Unterschale ausgeführt und als Wert zurückgegeben wird.

Abdellah Alaoui
quelle
2

Es man hostnamegibt noch eine einfachere Möglichkeit, Loopback-IP automatisch auszuschließen und nur eine durch Leerzeichen getrennte Liste aller Host-IP-Adressen zuzuweisen:

root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host 
   valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
  link/void 
  inet 11.12.13.14/32 scope global venet0:0
  inet 192.168.15.19/32 scope global venet0:1
user10101010
quelle
2

Sie können auch den folgenden Befehl verwenden:

ip route | grep src

HINWEIS: Dies funktioniert nur, wenn Sie eine Verbindung zum Internet haben.

Suchinfo
quelle
2

Erscheinen einige Antworten mit dem neueren werden ipBefehl (Ersatz ifconfig) hier so ist man , dass Anwendungen ip addr, grepund awkeinfach die IPv4 - Adresse mit der zugehörigen drucken wlan0Schnittstelle:

ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'

Obwohl es nicht die kompakteste oder ausgefallenste Lösung ist, ist es (wohl) leicht zu verstehen (siehe Erklärung unten) und kann für andere Zwecke geändert werden, z. B. um die letzten 3 Oktette der MAC-Adresse wie folgt abzurufen:

ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'

Erläuterung: ip addr show wlan0 Gibt Informationen aus, die der genannten Netzwerkschnittstelle zugeordnet sind. wlan0Diese sollten ungefähr so ​​aussehen:

4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::d340:5e4b:78e0:90f/64 scope link 
       valid_lft forever preferred_lft forever

Als nächstes grep inetfiltert die Linien , die „inet“ (IPv4 und IPv6 - Konfiguration) und enthält keine grep -v inet6filtert die restlichen Zeilen , die nicht „inet6“ enthalten, die in einer einzigen Zeile wie diese führen sollten:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

Schließlich awkextrahiert der erste das Feld "172.18.18.1/24" und der zweite entfernt die Kurzform der Netzwerkmaske, wobei nur die IPv4-Adresse übrig bleibt.

Ich denke auch, dass es erwähnenswert ist, dass es beim Erstellen von Skripten oft viele umfangreichere und / oder robustere Tools gibt, um diese Informationen zu erhalten, die Sie möglicherweise stattdessen verwenden möchten. Wenn Sie beispielsweise Node.js verwenden, gibt es ipaddr-linuxRubylinux-ip-parser usw.

Siehe auch /unix/119269/how-to-get-ip-address-using-shell-script

iX3
quelle
1

Verwenden Sie den folgenden Befehl:

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
Jose Martinez Poblete
quelle
1

Hier ist meine Version, in der Sie eine Liste von Schnittstellen übergeben können, sortiert nach Priorität:

getIpFromInterface()
{
    interface=$1
    ifconfig ${interface}  > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}

getCurrentIpAddress(){
    IFLIST=(${@:-${IFLIST[@]}})
    for currentInterface in ${IFLIST[@]}
    do
        IP=$(getIpFromInterface  $currentInterface)
        [[ -z "$IP" ]] && continue
    echo ${IP/*:}
    return
    done
}

IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@

Wenn ich also mit VPN, Wifi und Ethernet verbunden bin, wird meine VPN-Adresse (auf der Schnittstelle tap0) zurückgegeben. Das Skript funktioniert sowohl unter Linux als auch unter OSX und kann Argumente annehmen, wenn Sie IFLIST überschreiben möchten

Beachten Sie, dass Sie 'inet' durch 'inet6' ersetzen müssen, wenn Sie IPV6 verwenden möchten.

MatthieuP
quelle
1

Ich brauche das immer zu den unerwartetsten Zeiten und suche auf SO nach solchen Threads. Also habe ich ein einfaches Skript zu erhalten IPv4 - Adressen über netstat, genannt schrieb echoip- können Sie es hier finden . Die Bash für Netzwerkadressen sieht folgendermaßen aus. Sie erhält auch Ihre öffentliche Adresse von ipecho.net:

IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`

for i in "${!INTERFACES[@]}"; do
  printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done

Das echoipSkript liefert eine Ausgabe wie folgt:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2
Stites
quelle
1

Verwenden Sie dieses einzeilige Skript: ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' Mac & Linux (in Ubuntu getestet) funktionieren beide.

Huan
quelle
Schön, dass es bei beiden funktioniert. Außerdem können Sie es mit ifconfig en0oder ifconfig eth1usw. aufrufen, wenn Sie die gewünschte Schnittstelle kennen :)
Jaygooby
1

Ich bevorzuge es nicht awkund solche in Skripten zu verwenden .. iphat die Option, in JSON auszugeben.

Wenn Sie weglassen, erhalten $interfaceSie alle IP-Adressen:

ip -json addr show $interface | \
  jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
Tal Zion
quelle
Ich mag die Art und Weise, wie das Ergebnis des Befehls im JSON-Strukturformat wie der IP-Befehl. Hier ist eine andere Möglichkeit, die IP-Adresse ähnlich wie oben zu erhalten bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
Jack Liu Shurui
0
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

zeigt alle deine ips

Maxime
quelle
0

Auf Redhat 64bit löste dieses Problem für mich.

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
Statham
quelle
oder dies: curl ifconfig.me
Statham
0
#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux 
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "s@.* ([^ ]*) ->.*@\1@"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "s@\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\2@")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "s@\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\2@")
    if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
        echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
        for IPV4_ADDRESS in $IPV4_ADDRESSES; do 
            echo "IPV4=$IPV4_ADDRESS"
        done
        for IPV6_ADDRESS in $IPV6_ADDRESSES; do 
            echo "IPV6=$IPV6_ADDRESS"
        done
    fi
done
user11621528
quelle
0

Wenn Sie Ihre externe IP-Adresse auf einem NAT-Host nachschlagen, empfehlen einige Antworten die Verwendung von HTTP-basierten Methoden wie ifconfig.mez.

$ curl ifconfig.me/ip

Im Laufe der Jahre habe ich viele dieser Websites kommen und gehen sehen. Ich finde diese DNS-basierte Methode robuster:

$ dig +short myip.opendns.com @resolver1.opendns.com

Ich habe diesen praktischen Alias ​​in meinem ~/.bashrc:

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'
htaccess
quelle
0

Diese beiden Möglichkeiten haben bei mir funktioniert:

Um die IP-Adresse Ihrer Schnittstelle eth0 zu erhalten. Ersetzen Sie eth0 im folgenden Beispiel durch Ihren Schnittstellennamen. ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

Verwenden des Hostnamens: Dies gibt Ihnen das Inet, dh die IP-Adresse Ihres Ethos. Wenn Sie -I verwenden, erhalten Sie den Inet-Wert aller Schnittstellen, sofern dieser Wert vorhanden ist.

hostname -i

Milind
quelle
-1
curl ifconfig.co 

Dies gibt nur die IP-Adresse Ihres Systems zurück.

Prudhvi Raj Mudunuri
quelle
1
Dies erfordert eine funktionierende Internetverbindung und gibt Ihre öffentlich sichtbare IP-Adresse zurück, die möglicherweise Ihren Wünschen entspricht oder nicht.
24.
-2

Ich würde verwenden Hostname -L, um nur die IP als Variable in einem Skript zu verwenden.

HtmlGifited
quelle
Vielleicht haben Sie versucht zu sagen hostname -ioder hostname -I?
24.
user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1. Kapital Hist falsch 2. Kein solches-L
Sabrina