web-dev-qa-db-fra.com

Comment obtenir une adresse IP en utilisant un script Shell?

Vous voulez obtenir l'adresse IP à l'aide du script Shell. Sans connaître eth0 ou eth1 ou eth2 Comment obtenir l'adresse IP particulière.

Je ne souhaite pas obtenir l'adresse de l'hôte local, je souhaite obtenir adresse IP privée.

44
Beginner

Pour répertorier 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 l'interface (par exemple eth0) juste après ifconfig si vous ne souhaitez que l'IP d'une interface spécifique:

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

ou:

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

Tu peux 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, J'obtiens:

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, j'obtiens 192.168.0.85 Qui est l'adresse IP de em1.

Pour le mettre dans une variable à l'intérieur d'un 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 l'adresse IP.

63
lgeorget

Copier la pâte flagrante de stackoverflow puisque nous ne pouvons pas duper entre les sites. Je sais que ce n'est pas bash ou sh, mais qui n'a pas python installé à ce stade de toute façon?

Vous devez 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 copier-coller

Si tout ce que vous voulez, c'est l'IP de l'interface montante et sortante, this fonctionne.

Encore une autre option si vous voulez simplement énumérer les interfaces, car personne ne semble pouvoir comprendre 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
11
RobotHumans