Je veux faire un gros script sur ma Debian 7.3 (quelque chose comme une traduction et beaucoup plus de nouvel environnement convivial). J'ai un problème. Je souhaite utiliser uniquement certaines des informations fournies par les commandes. Par exemple, mon ifconfig ressemble à:
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1309425 (1.2 MiB) T
Je veux afficher uniquement l'adresse IP en ligne: echo "Votre adresse IP est: (IP_ADDRESS)". Existe-t-il une commande qui me permet de faire une telle chose, de rechercher dans le flux d’informations que je veux obtenir ?. Je connais grep
et sed
mais je ne suis pas très bon avec eux.
Edit: Tout d'abord, merci de m'avoir aidé à résoudre ce problème, maintenant j'en sais beaucoup plus. Deuxièmement, le projet est en cours. Si quelqu'un s'y intéressait, juste moi.
Pour obtenir simplement votre adresse IP:
echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`
Cela vous donnera l'adresse IP de eth0.
Edit: En raison des changements de nom des interfaces dans les versions récentes d’Ubuntu, cela ne fonctionne plus. Au lieu de cela, vous pouvez simplement utiliser ceci:
hostname --all-ip-addresses
ou hostname -I
, qui fait la même chose (vous donne TOUTES les adresses IP de l'hôte).
Si le but est de trouver l'adresse IP connecté en direction d'Internet, alors cela devrait être une bonne solution.
MISE À JOUR!!! Avec la nouvelle version de linux, vous obtenez plus d’informations sur la ligne:
ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
cache
donc pour obtenir une adresse IP, vous devez trouver l'adresse IP après src
ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
10.36.15.150
et si vous aimez le nom de l'interface
ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ens192
ip route
n'ouvre aucune connexion, il montre simplement l'itinéraire nécessaire pour se rendre à 8.8.8.8
. 8.8.8.8
est le DNS de Google.
Si vous aimez stocker ceci dans une variable, faites:
my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')
Pourquoi une autre solution peut échouer:
ifconfig eth0
Hostname -I
Si vous voulez obtenir une liste de vos adresses IP séparées par des espaces, vous pouvez utiliser la commande hostname
avec le --all-ip-addresses
(court -I
) drapeau
hostname -I
comme décrit ici: Mettre l'adresse IP dans la variable bash. Existe-t-il un meilleur moyen ?
ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"
Peut-être pas pour tous les cas (surtout si vous avez plusieurs NIC), ceci aidera:
hostname -I | awk '{ print $1 }'
/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'
Faites votre choix:
$ cat file
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1309425 (1.2 MiB) T
$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103
$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103
Juste une note, puisque je viens de passer du temps à dépanner une mise à niveau bâclée sur un serveur. Il s’est avéré que j’avais mis en place un test pour vérifier si des interfaces ajoutées de manière dynamique (par exemple, eth0: 1) étaient présentes et, le cas échéant, je lierais certains proggis à l’IP "principale" sur eth0. En gros, il s'agissait d'une variante de la solution 'ifconfig | grep ... | sed ...' (plus la vérification de la présence de 'eth0:').
La mise à jour a apporté de nouveaux outils réseau et avec elle, la sortie a légèrement changé:
ancien ifconfig:
eth0 Link encap:Ethernet HWaddr 42:01:0A:F0:B0:1D
inet addr:10.240.176.29 Bcast:10.240.176.29 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
...<SNIP>
alors que la nouvelle version affichera ceci:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1460
inet 10.240.212.165 netmask 255.255.255.255 broadcast 10.240.212.165
...<SNIP>
rendant la recherche de 'eth0:' ainsi que de 'inet addr:' la recherche a échoué (peu importe les interfaces appelées 'em0', 'br0' ou 'wlan0' ...). Bien sûr, vous pouvez vérifier 'inet' (ou 'inet6'), et rendre l'adr: part optionnel, mais en regardant de plus près, vous verrez que plus ou moins tout a changé, 'Mask' est maintenant 'netmask', .. .
La suggestion 'ip route ...' est assez astucieuse - alors peut-être:
_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
_MyIPs="$( hostname -I )"
for _MyIP in "$_MyIPs"
do
echo "Found IP: \"$_MyIP\""
done
else
echo "Found IP: $_MyIP"
fi
Eh bien, quelque chose de ce genre quand même. Dans la mesure où toutes les solutions proposées semblent échouer, vérifiez les cas Edge possibles - pas d’Eth, plusieurs eth & lo, quand "hostname -i" échouera, ... puis choisissez la meilleure solution, vérifiez que cela fonctionne, sinon 2e meilleur.
Cheers 'n' beers!
Une légère modification à l'un des précédents ip route ...
solutions, ce qui élimine le besoin d’un grep:
ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'
À mon avis, le moyen le plus simple et le plus élégant de réaliser ce dont vous avez besoin est le suivant:
ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7
ip route get [Host]
- vous donne la passerelle utilisée pour atteindre un hôte distant, par exemple:
8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109
tr -s ' '
_ - supprime tous les espaces supplémentaires, vous avez maintenant l'uniformité, par exemple:
8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109
cut -d' ' -f7
- tronque la chaîne en '' champs séparés par des espaces, puis en sélectionne le champ n ° 7, par exemple:
192.168.0.109
awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103