it-swarm.com.de

Welcher Terminalbefehl bekommt man nur IP Adresse und sonst nichts?

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

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

77
Mason

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

/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 ein Linux-System

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

hostname -i # Debian
121
Book Of Zeus

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 zeigt nur eth0:

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

Auf diese Weise erhalten Sie IPv6-Adressen:

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

Nur eth0 IPv6:

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

Im Allgemeinen ist es niemals garantiert, 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

Unter Linux listet hostname -I die aktuelle IP-Adresse (n) auf. Wenn Sie sich darauf verlassen, dass immer nur eine IP-Adresse zurückgegeben wird, funktioniert dies in einigen Szenarien wahrscheinlich nicht wie erwartet (d. H. Eine VPN-Verbindung ist aktiv). Eine zuverlässigere Methode wäre das Konvertieren des Ergebnisses in ein Array und das Durchlaufen der Elemente:

ips=($(hostname -I))

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

OSX

Unter OSX, wenn Sie die Schnittstelle kennen, können Sie Folgendes verwenden:

~$ ipconfig getifaddr en0
192.168.1.123

das wird nur die IP-Adresse zurückgeben.

Oder Sie könnten mögliche Schnittstellennamen durchlaufen, beginnend mit einem Suffix, d. H. 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, ein Computer über mehrere Ethernet-Schnittstellen verfügt oder wenn VPN-Tunnel vorhanden sind.

Erhalten der externen IP

Wenn Sie die externe IP-Adresse benötigen, können Sie einen Textmodus-Dienst abfragen. Beispielsweise würde curl ipecho.net/plain einen Klartext external IP zurückgeben.

30
ccpizza

Bei den neuesten Versionen von Ubuntu ( 14.04 - 16.04 ) hat dieser Befehl den Trick für mich gemacht.

hostname -I | awk '{print $1}'
9
Da CodeKid
hostname -I  

Mit diesem Befehl erhalten Sie die genaue IP-Adresse, die Sie in Ubuntu benötigen.

7
Vignajeth

Wenn die Umgebung eingeschränkt ist, können Sie diesen Befehl verwenden:

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
6
caglar

Der Befehl ifconfig ist abgewiesen und Sie sollten den Befehl ip unter Linux verwenden.

Außerdem gibt Ihnen ip a den gleichen Bereich wie IP, um die Verwendung zu vereinfachen.

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:]+'
5
Nux

Ich wollte etwas einfaches, das als Bash-Alias ​​funktioniert. Ich fand, dass hostname -I am besten für mich funktioniert (Hostname v3.15). hostname -i gibt die Loopback-IP aus irgendeinem Grund zurück, aber hostname -I gibt mir die richtige IP für wlan0 und ohne dass die Ausgabe durch grep oder awk geleitet werden muss. Ein Nachteil ist, dass hostname -I alle IPs ausgibt, wenn Sie mehrere haben.

3
Andy Forceno

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

Gehen Sie unter Linux davon aus, dass Sie die IP-Adresse von der eth0-Schnittstelle abrufen, und führen Sie den folgenden Befehl aus:

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

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

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

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

ipconfig getifaddr en0
3
Tukan3

In man hostname ist es noch einfacher, die Loopback-IP automatisch auszuschließen und nur durch Leerzeichen getrennte Liste aller IP-Adressen von Host anzuzeigen:

[email protected]:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

[email protected]:~# 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
2
user10101010

Das würde den Trick in einem Mac tun:

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

Das löste ping 192.168.1.2 in meinem Rechner auf.

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

2
Abdellah Alaoui

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

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 [email protected]

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

Wenn Sie IPV6 verwenden möchten, müssen Sie "inet" durch "inet6" ersetzen.

1
MatthieuP

Verwenden Sie den folgenden Befehl:

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

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 (getestet in Ubuntu).

1
Huan

Sie können auch den folgenden Befehl verwenden: 

ip route | grep src

HINWEIS: Dies funktioniert nur, wenn Sie mit dem Internet verbunden sind. 

1
Search Info

Ich brauche dies immer zu den unerwartetsten Zeiten und auf jeden Fall suche ich auf SO nach solchen Threads. Also habe ich ein einfaches Skript geschrieben, um IPv4-Adressen über netstat zu erhalten, genannt echoip - Sie finden es hier . Die Bash für Netzwerkadressen sieht so 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 echoip-Skript liefert eine Ausgabe wie folgt:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2
1
stites
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

zeigt alle deine ips

0
MaXiM
#!/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 "[email protected]* ([^ ]*) ->.*@\[email protected]"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "[email protected]\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\[email protected]")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "[email protected]\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\[email protected]")
    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
0
user11621528

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

$ curl ifconfig.me/ip

Im Laufe der Jahre, in denen ich viele dieser Websites gesehen habe, finde ich 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'
0
htaccess

Auf Redhat 64bit wurde dieses Problem für mich gelöst.

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
0
Statham

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

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

Verwenden Sie zum Bestimmen der primären Schnittstelle (da dies möglicherweise nicht "eth0" ist) Folgendes:

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

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

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