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.
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)}'
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.
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