Saltar al contenido

¿Cómo obtener la dirección IP usando un script de shell?

Ten en cuenta que en las ciencias informáticas un error suele tener varias resoluciones, de igual modo aquí te compartiremos lo mejor y más eficiente.

Solución:

Tu puedes hacer :

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

que le da la primera dirección IP privada que aparece en ip addr.

Por ejemplo, con ip addr, Yo obtengo:

1: lo:  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:  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:  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:  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

Con la línea de comandos anterior, obtengo 192.168.0.85 cual es la direccion ip de em1.

Para ponerlo en una variable dentro de un script de shell, puede hacer var=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk 'print $2' | cut -f1 -d'/'). Ahora, hasta el final del guión, $var tendrá el valor de la dirección IP.

Para enumerar todas las direcciones IP, independientemente del nombre, intente esto:

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

o:

ifconfig | awk '/inet addr/print substr($2,6)'

Especifique el nombre de la interfaz (por ejemplo, eth0) justo después ifconfig si solo quieres la IP de una interfaz específica:

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

o:

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

Copia y pegado flagrante de stackoverflow ya que no podemos engañar a través de los sitios. Sé que no es bash o sh, pero ¿quién no tiene Python instalado en este punto de todos modos?

Deberías usar netifaces. Está diseñado para ser multiplataforma en Mac OS X, Linux y 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.nnReturns a dict whose keys are equal to the address family constants,ne.g. netifaces.AF_INET, and whose values are a list of addresses innthat family that are attached to the network interface.'
>>> # for the IPv4 address of eth0
>>> ni.ifaddresses('eth0')[2][0]['addr']
'24.19.161.6'

Los números utilizados para indexar los protocolos son de /usr/include/linux/socket.h (en Linux)…

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

Fin de copiar y pegar

Si todo lo que desea es la IP de la interfaz ascendente y saliente, esto funciona.

Otra opción más si solo desea enumerar las interfaces, ya que nadie parece poder entender exactamente lo que desea:

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

Comentarios y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *