web-dev-qa-db-fra.com

Analyser ifconfig pour obtenir uniquement mon adresse IP à l'aide de Bash

Je veux éditer le fichier bashrc pour avoir une fonction simple appelée "myip" à exécuter. Comme vous pouvez le deviner, la fonction myip imprime uniquement l'adresse IP interne de ma machine.

Aussi loin que je travaille, voici le script:

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

Qui a obtenu ma cette sortie:

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

Je travaille sur Mac OS X.

Comment puis-je faire cela?

14
Fernando Retimo

Après des heures de lutte, je me suis finalement bien compris:

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

La dernière partie qui me manquait est juste un motif d’adresses IP de ma liste.

8
Fernando Retimo

Les deux suivants fonctionnent ici (CentOS 5).

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

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

Pour OS X ( v10.11 (El Capitan) au moins):

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

C’est le moyen le plus "agnostique" d’obtenir l’adresse IP, quel que soit le système * nix (Mac OS, Linux), le nom de l’interface et même la configuration de votre environnement local:

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

Si vous avez plus d'une adresse IP active, listez chacune d'elles sur une ligne séparée. Si vous voulez seulement la première adresse IP, ajoutez | head -n1 à l'expression:

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

Et si vous souhaitez connaître l'adresse IP d'une interface spécifique, remplacez la première expression ifconfig par ifconfig INTERFACENAME, par exemple ifconfig eth0 | grep -E ....

Voici quelques exemples mentionnés dans cette page qui échouent dans certaines circonstances et pourquoi:

  • ip route ...: la commande ip n'est pas installée sur les ordinateurs OSX.
  • hostname -I: l'option -I n'est pas valide sous OSX.
  • ifconfig en0 ...: les noms d'interface (eth0, en0) sont différents sous Linux et OSX, et le nom sous Linux dépend également du type d'interface (ethX pour la connexion Ethernet, wlanX pour le sans fil, etc.).
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))': cela m'a donné 127.0.1.1 (une adresse IP loopback) dans Ubuntu Linux 14.04, donc ne fonctionne pas.
  • ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ': la publication de Geograph est la plus proche, mais ne fonctionne pas dans certaines distributions Linux sans que LANG=en soit configuré, car le texte inet addr: recherché par grep est affiché avec un texte différent dans les autres paramètres régionaux et sous Mac OS, cette étiquette est également différente .
14
Mariano Ruiz

Dans le cas de eth0, ce qui suit fonctionne pour moi. Essayez de le modifier avec la même logique.

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

Vous pouvez utiliser awk pour sélectionner la ligne inet et analyser l'adresse IP de la manière suivante:

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

Dans l'exemple ci-dessus, remplacez eth0 par le handle de périphérique docker0 dans. De plus, si vous voulez une implémentation pure AWK , vous pouvez faire la "découpe" comme ceci:

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

Il existe un autre moyen simple d'obtenir l'adresse IP en dehors de l'analyse ifconfig.

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

Réf: http://linux.die.net/man/1/hostname

Exemple:

[ec2-user @ terraform ~] $ nom_hôte -I
10.10.10.10

3
Baskar

Exemples IPv4 avec BASH4 +

Exemple 1 , en utilisant le nom d'hôte:

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

Exemple 2, le périphérique est connu (et il ne change jamais):

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

Exemple 3 , n’affiche pas le périphérique (par exemple, eth0, eth1, enp0s23 ou wpxxx):

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

Exemple 4 , voulez l'adresse IP du réseau:

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

prendre plaisir.

3
Mike Q

Pas besoin de faire l'analyse ifportf unportable dans Bash. C'est un one-liner trivial en Python:

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

Si vous recherchez juste "inet" et non "inet6", cela fonctionne pour moi:

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

"--Word-regexp" demandera à grep de rechercher le mot entier "inet" et de ne pas faire correspondre les partiels des mots, c.-à-d. "Inet" ne correspondra pas à "inet6" - "inet" ne fera correspondre que les lignes comportant "inet" .

1
Jonathan Le

Vous pouvez aussi essayer ceci

user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
user@linux:~$ 

Sortie

user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$

Veuillez noter que la sortie de ifconfig peut être différente selon votre version de linux. Par conséquent, vous voudrez peut-être changer le script en conséquence.

Btw, c'est ma sortie ifconfig

user@linux:~$ 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)

user@linux:~$
1
Charlotte Russell

Utilisation:

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

enops3 est le nom de l'interface.

0
Khalid Abdlqader

Ce code génère les adresses IP pour toutes les connexions réseau (sauf le bouclage) et est portable entre les versions most OS X et Linux .

C'est particulièrement utile pour les scripts qui s'exécutent sur des machines où:

  • La carte réseau active est inconnue,
  • des ordinateurs portables qui basculent entre des connexions Wi-Fi et Ethernet, et
  • machines avec plusieurs connexions réseau.

Le script est:

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

Ceci peut être assigné à une variable dans un script comme ceci:

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

Les scripts peuvent gérer plusieurs adresses possibles en utilisant une boucle pour traiter les résultats, comme suit:

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

Remarques:

  • Il filtre 'ifconfig' sur "cast", ce qui a pour effet supplémentaire de filtrer les adresses en boucle tout en fonctionnant également sur la plupart des versions OS X et Linux.
  • La dernière fonction 'couper' est nécessaire au bon fonctionnement sous Linux, mais pas sous OS X. Toutefois, elle n’affecte pas les résultats sous OS X - elle est donc laissée à la portabilité.
0
azrobbo

Similaire à JSR, mais avec awk et cut dans l’ordre inverse:

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

Le code fonctionne aussi sur VDS/VPS:

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

ou

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

Après avoir essayé quelques solutions, je trouve cela le plus pratique, ajoutez-le à votre alias:

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

la sortie ressemble à ceci:

shady@Shadys-MacBook-Pro: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