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
?
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
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:]+'
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.
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
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.
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.
Sur les dernières Ubuntu versions ( 14.04 - 16.04 ), cette commande a fait le tour pour moi.
hostname -I | awk '{print $1}'
hostname -I
Cette commande vous donnera l'adresse IP exacte que vous voulez dans Ubuntu.
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
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:]+'
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.
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}'
Pour obtenir uniquement l'adresse IP sur Mac OS X vous pouvez taper la commande suivante:
ipconfig getifaddr en0
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
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.
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".
Utilisez la commande suivante:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
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.
Vous pouvez également utiliser la commande suivante:
ip route | grep src
NOTE: Cela ne fonctionnera que si vous avez une connexion Internet.
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
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
montre tous vos ips
#!/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
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'
Sur Redhat 64bit, ce problème résolu pour moi.
ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
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.]+'