Comment obtenir une adresse IP à laide dun script shell? [dupliquer]

Cette question a déjà des réponses ici :

Commentaires

  • Isn ' t ifconfig -a ce que vous ' cherchez?
  • @rajcoumar Je ne vois pas pourquoi lutilisation dune adresse IP privée vous interdit dutiliser la sortie de ifconfig -a. En fait, la réponse que vous avez marquée comme acceptée fait exactement cela (utilise simplement ip au lieu de ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Réponse

Pour lister toutes les adresses IP, quel que soit leur nom, essayez ceci:

ifconfig | perl -nle "s/dr:(\S+)/print $1/e" 

ou:

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

Spécifiez le nom de linterface (par exemple eth0) juste après ifconfig si vous ne voulez que ladresse IP dune interface spécifique:

ifconfig eth0 | perl -nle "s/dr:(\S+)/print $1/e" 

ou:

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

Commentaires

  • merci, ceci est ma sortie 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, maintenant je veux prendre 10.192.1.218 et attribuer une nouvelle variable dans le script shell. comment faire?
  • qui afficherait simplement les adresses IP .. ce serait mieux si les noms dinterface correspondants comme eth0, eth1, … sont également affichés. 🙂
  • Utilisez absolument les tables de routage comme @ymattw le suggère! Cela a la merveilleuse propriété de renvoyer exactement ladresse par laquelle votre ordinateur est configuré pour parler à ladresse donnée. Je pense que vous voulez probablement que awk '{print $NF; exit}', cependant, pour obtenir le dernier champ (adresse source) de la première ligne.
  • Merci davoir signalé, ressemble à mon dernier la modification n’a pas été ' enregistrée. Intéressant, je ne pourrais pas ' modifier ma propre réponse, donc republiez simplement: ip route get 1.1.1.1 | awk '{print $NF; exit} # ceci obtenir lip de linterface qui peut atteindre à lextérieur

Réponse

Vous pouvez faire:

ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"

qui vous donne la première adresse IP privée répertoriée dans ip addr.

Par exemple, avec ip addr, jobtiens:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:76:de:c1:f1 brd ff:ff:ff:ff:ff:ff inet 192.168.0.85/24 brd 192.168.0.255 scope global dynamic em1 valid_lft 42505sec preferred_lft 42505sec inet6 fe80::216:76ff:fede:c1f1/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500 link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff 

Avec la ligne de commande avant, jobtiens 192.168.0.85 qui est ladresse IP de em1.

Pour la placer dans une variable à lintérieur dun script shell, vous pouvez faire var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Maintenant, jusquà la fin du script, $var aura la valeur de ladresse IP.

Commentaires

  • Et en effet, il ' est très similaire à unix.stackexchange.com/questions/8518/… . Je nai pas cherché de doublons avant de poster …
  • ip addr | grep ' état UP ' -A2 | tail -n1 | awk ' {print $ 2} ' | cut -f1 -d ' / ' en utilisant cette commande jai obtenu une adresse privée. Maintenant, je veux attribuer la sortie à une variable
  • @rajcoumar Jai mis à jour la réponse. Notez que cette question a déjà été posée et répondue sur ce site. Voir unix.stackexchange.com/questions/4569/… pour plus de détails.
  • Remarque aussi que ma réponse nest pas des plus élégantes. Il peut y avoir une meilleure façon de faire cela que danalyser la sortie de ip addr.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' cela fonctionne aussi, au fait

Réponse

Copie-coller flagrant de stackoverflow car nous ne pouvons pas « tromper » dun site à lautre. Je sais que ce nest pas bash ou sh, mais qui na pas installé python à ce stade de toute façon?

Vous devriez utiliser netifaces . Il est conçu pour être multiplateforme sur Mac   OS   X, Linux et Windows.

>>> import netifaces as ni >>> ni.interfaces() ["lo", "eth0", "eth1", "vboxnet0", "dummy1"] >>> ni.ifaddresses("eth0") {17: [{"broadcast": "ff:ff:ff:ff:ff:ff", "addr": "00:02:55:7b:b2:f6"}], 2: [{"broadcast": "24.19.161.7", "netmask": "255.255.255.248", "addr": "24.19.161.6"}], 10: [{"netmask": "ffff:ffff:ffff:ffff::", "addr": "fe80::202:55ff:fe7b:b2f6%eth0"}]} >>> >>> ni.ifaddresses.__doc__ "Obtain information about the specified network interface.\n\nReturns a dict whose keys are equal to the address family constants,\ne.g. netifaces.AF_INET, and whose values are a list of addresses in\nthat family that are attached to the network interface." >>> # for the IPv4 address of eth0 >>> ni.ifaddresses("eth0")[2][0]["addr"] "24.19.161.6" 

Les nombres utilisés pour indexer les protocoles proviennent de /usr/include/linux/socket.h (sous Linux) …

#define AF_INET 2 /* Internet IP Protocol */ #define AF_INET6 10 /* IP version 6 */ #define AF_PACKET 17 /* Packet family */ 

Fin du copier-coller

Si tout ce que vous voulez, cest ladresse IP du up et interface sortante, cela fonctionne.

Pourtant UNE AUTRE option si vous voulez juste énumérer les interfaces, car personne ne semble être en mesure de sous tand exactement ce que vous voulez:

import netifaces as ni ints = ni.interfaces() for i in ints: if "eth" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass elif "wlan" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass 

Commentaires

  • Notez que le PO a déclaré dans sa question que il ne ' ne sait pas à lavance quelle interface est UP.Il veut juste que ladresse IP de linterface soit dans létat " up " sans savoir de quoi il sagit.
  • Ensuite, ' ne fait quobtenir ladresse locale dune socket ouverte vers Google. La façon dont je lai lu, il voulait énumérer toutes les interfaces et mapper les adresses IP aux interfaces plutôt que douvrir simplement une socket et de rechercher ladresse IP locale.
  • Ajout dun script simple pour adresser le " donnez-moi simplement ladresse IP sortante " problème.
  • Il ne ' t veulent son adresse externe mais son adresse privée. Daprès ce que je comprends, il pourrait être connecté à un réseau privé par lune de ses interfaces et veut simplement connaître son adresse IP privée sans savoir quelle interface est utilisée.
  • Ladresse privée serait toujours donnée par le deuxième script, il ' nest que ladresse privée sortante.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *