web-dev-qa-db-fra.com

Quelle commande de terminal pour obtenir uniquement une adresse IP et rien d’autre?

J'essaie d'utiliser uniquement l'adresse IP (inet) en tant que paramètre dans un script que j'ai écrit.

Existe-t-il un moyen simple, dans un terminal unix, d’obtenir uniquement l’adresse IP, au lieu de parcourir ifconfig

77
Mason

Vous pouvez écrire un script qui ne retourne que l'adresse IP de la manière suivante:

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

Pour Mac:

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

Ou pour le système Linux

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

hostname -i # Debian
121
Book Of Zeus

Cela vous donnera toutes les interfaces IPv4, y compris le bouclage 127.0.0.1:

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

Cela affichera uniquement eth0:

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

Et de cette façon, vous pouvez obtenir des adresses IPv6:

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

Seulement eth0 IPv6:

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

En règle générale, il n'est jamais garanti qu'un système ne possède qu'une seule adresse IP. Par exemple, vous pouvez avoir une connexion Ethernet et une connexion WLAN. Si vous avez une connexion VPN active, vous disposez d'une autre adresse IP.

Linux

Sous Linux, hostname -I liste les adresses IP actuelles. Compter sur le fait qu'il renvoie toujours une seule adresse IP ne fonctionnera probablement pas comme prévu dans certains scénarios (c'est-à-dire qu'un lien VPN est actif). Un moyen plus fiable consisterait donc à convertir le résultat en tableau, puis à parcourir les éléments:

ips=($(hostname -I))

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

OSX

Sur OSX, si vous connaissez l'interface , vous pouvez utiliser:

~$ ipconfig getifaddr en0
192.168.1.123

qui retournera juste l'adresse IP.

Vous pouvez également parcourir les noms d’interface possibles en commençant par un suffixe, c.-à-d. en:

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

echo $myip

De plus, l'obtention de l'adresse IP devient non déterministe dans le cas où une connexion par câble et une connexion Wi-Fi sont établies, lorsqu'un ordinateur possède plusieurs interfaces Ethernet ou en présence de tunnels VPN.

Obtenir l'IP externe

Si vous avez besoin d'une adresse IP externe, vous pouvez alors interroger un service en mode texte. Par exemple, curl ipecho.net/plain renverrait un texte brut external IP.

30
ccpizza

Sur les dernières Ubuntu versions ( 14.04 - 16.04 ), cette commande a fait le tour pour moi.

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

Cette commande vous donnera l'adresse IP exacte que vous voulez dans Ubuntu.

7
Vignajeth

Si votre environnement est limité, vous pouvez utiliser cette commande:

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

La commande ifconfig est privée et vous devez utiliser la commande ip sous Linux.

De plus, ip a vous donnera la portée sur la même ligne qu'IP, pour une utilisation plus facile.

Cette commande vous montrera votre IP globale (externe):

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

Tous les IPv4 (également 127.0.0.1):

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

Tous les IPv6 (aussi :: 1):

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

Je voulais quelque chose de simple qui fonctionne comme un alias Bash. J'ai trouvé que hostname -I fonctionnait mieux pour moi (nom d'hôte v3.15). hostname -i renvoie l'IP en boucle, pour une raison quelconque, mais hostname -I me donne l'adresse IP correcte pour wlan0, sans avoir à canaliser la sortie via grep ou awk. Un inconvénient est que hostname -I affichera tous IPs, si vous en avez plusieurs.

3
Andy Forceno

Nous pouvons simplement utiliser seulement 2 commandes (ifconfig + awk) pour obtenir uniquement l'adresse IP (v4) que nous voulons comme ceci:

Sous Linux, en supposant que l'adresse IP de l'interface eth0 soit obtenue, exécutez la commande suivante:

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

Sous OSX, pour obtenir l'adresse IP de l'interface en0, exécutez la commande suivante:

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

Pour obtenir uniquement l'adresse IP sur Mac OS X vous pouvez taper la commande suivante:

ipconfig getifaddr en0
3
Tukan3

Dans man hostname, il existe un moyen encore plus simple d'exclure automatiquement les adresses IP en boucle et d'afficher uniquement la liste de toutes les adresses attribuées aux adresses IP de l'hôte séparées par des espaces:

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
2
user10101010

Cela ferait l'affaire dans un Mac:

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

Cela résolu à ping 192.168.1.2 dans ma machine.

Pro tip : $(...) signifie exécuter tout ce qui se trouve entre les parenthèses dans un sous-shell et le renvoyer comme valeur. 

2
Abdellah Alaoui

Voici ma version, dans laquelle vous pouvez passer une liste d'interfaces, classées par priorité:

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 $@

Donc, si je suis connecté avec VPN, Wifi et Ethernet, mon adresse VPN (sur l'interface tap0) sera renvoyée. Le script fonctionne à la fois sur linux et osx, et peut prendre des arguments si vous souhaitez remplacer IFLIST. 

Notez que si vous souhaitez utiliser IPV6, vous devrez remplacer "inet" par "inet6".

1
MatthieuP

Utilisez la commande suivante:

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

utilisez ce script d'une ligne: 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 (testé dans Ubuntu) les deux fonctionnent.

1
Huan

Vous pouvez également utiliser la commande suivante: 

ip route | grep src

NOTE: Cela ne fonctionnera que si vous avez une connexion Internet. 

1
Search Info

Je finis toujours par avoir besoin de ça aux moments les plus inattendus et, sans faute, je finis par chercher des sujets comme celui-ci sur SO. J'ai donc écrit un script simple pour obtenir les adresses IPv4 via Netstat, appelé echoip - vous pouvez le trouver ici . Le bash pour les adresses réseau ressemble à ceci, il récupère également votre adresse publique sur 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

Le script echoip génère une sortie comme celle-ci:

$ 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}'

montre tous vos 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 "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
0
user11621528

Lors de la recherche de votre adresse IP externe sur un hôte NAT, un certain nombre de réponses suggèrent d'utiliser des méthodes basées sur HTTP telles que ifconfig.me, par exemple:

$ curl ifconfig.me/ip

Au fil des ans, j'ai vu beaucoup de ces sites aller et venir, je trouve cette méthode basée sur le DNS plus robuste:

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

J'ai cet alias pratique dans mon ~/.bashrc:

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

Sur Redhat 64bit, ce problème résolu pour moi.

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

Pour imprimer uniquement l'adresse IP de eth0, sans autre texte:

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

Pour déterminer votre interface principale (car ce n'est peut-être pas "eth0"), utilisez:

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

Les deux lignes ci-dessus peuvent être combinées en une seule commande comme celle-ci:

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