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?
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.
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}'
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 .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}'
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
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
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.
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()))'
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" .
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:~$
Utilisation:
ifconfig enops3 | greb broadcast | cut -d " " -f10
Où enops3
est le nom de l'interface.
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ù:
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:
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}
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 ' '
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