Visualización de la dirección IP en la interfaz eth0

24

¿Cómo puedo mostrar la dirección IP que se muestra en eth0 usando un script?

user43389
fuente

Respuestas:

28

guardar esto en un archivo y luego ejecutar bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

siendo más preciso para obtener solo el número que muestra la dirección IP:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

Actualización : si esto no funciona para usted, pruebe la otra respuesta

Edward Torvalds
fuente
2
Por supuesto, esto no funciona en el último ubuntu. las últimas declaraciones de ifconfig "inet <IP>" en lugar de "inet addr <ip>"
Thang
puedes usargrep "inet"
Andrei Radulescu
26

En aras de proporcionar otra opción, puede utilizar el ip addrcomando de esta manera para obtener la dirección IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 muestra información sobre eth0
  • grep "inet\b"solo muestra la línea que tiene la dirección IPv4 (si desea la dirección IPv6, cámbiela por "inet6\b")
  • awk '{print $2}' imprime en el segundo campo, que tiene la dirección IP / máscara, ejemplo 172.20.20.15/25
  • cut -d/ -f1 solo toma la parte de la dirección IP.

En un guion:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Alaa Ali
fuente
¡esta solución realmente funciona!
thang
ip -4 ... e ip -6 ...! ¡Gracias!
TamusJRoyce
17

Tomado de /programming//a/14910952/1695680

hostname -i

Sin embargo, eso puede devolver una dirección IP local (127.0.0.1), por lo que puede que tenga que usar y filtrar:

hostname -I

De las páginas de manual de hostname:

-i, --ip-address

Mostrar las direcciones de red del nombre de host. Tenga en cuenta que esto solo funciona si se puede resolver el nombre de host. Evite usar esta opción; use hostname --all-ip-address en su lugar.

-I, --all-ip-addresses

Mostrar todas las direcciones de red del host. Esta opción enumera todas las direcciones configuradas en todas las interfaces de red. La interfaz de bucle invertido y las direcciones locales de enlace IPv6 se omiten. Contrariamente a la opción -i, esta opción no depende de la resolución del nombre. No haga suposiciones sobre el orden de la salida.

ThorSummoner
fuente
para que conste, me gusta ip addr show label 'enp*'más, pero me molesta analizar, algo así ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2puede funcionar ... qué bonito
ThorSummoner
5

La respuesta de @ markus-lindberg es mi favorita. Si agrega -o -4a las banderas de ip, obtendrá un resultado mucho más fácil de analizar (y coherente):

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-osignifica --oneline, que está destinado a ayudar en exactamente este tipo de situaciones. Se -4agrega para limitar la dirección IPv4, que es lo que implican todas las otras respuestas.

Amos Shapira
fuente
Amo las ipbanderas. Uso cutde awkhechicería en lugar de avanzada :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ
@DuffJ probablemente se deba a una cuestión de gustos personales. "Descubrí" cutmucho después de enterarme awk, y me gusta minimizar la cantidad de comandos en mis tuberías. Buena sugerencia en cualquier caso.
Amos Shapira
Estoy completamente de acuerdo, Amos. ¡Gracias por tu solución!
DuffJ
3

Aquí hay algunos anuncios .....

Awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

La función de división en el comando awk anterior divide la segunda columna en función del delimitador :y almacena el valor dividido en una matriz asociativa a. Entonces a[2]tiene el valor de la segunda parte.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

En sed básico, \(...\)llamado grupo de captura que se utiliza para capturar los personajes. Podríamos referir a esos personajes capturados a través de referencias. \([^[:space:]]\+\)captura cualquier personaje pero no espacio una o más veces.

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\Kdescarta los caracteres previamente coincidentes de la impresión en la final y \S+coincide con uno o más caracteres no espaciales.

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

Se inet addr:capturan uno o más caracteres no espaciales que están al lado de la cadena y finalmente imprimimos solo los caracteres capturados.

Avinash Raj
fuente
@edwardtorvalds agregó alguna explicación. Creo que esto sería útil para futuros lectores. No dude en hacer cualquier pregunta de los comandos anteriores ... :)
Avinash Raj
2

Aquí hay uno bueno, solo usa grep como comando secundario:

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

No veo por qué deberías usar más comandos de los necesarios

Almiar
fuente
2

Debería usar ip(en lugar de ifconfig) ya que es actual, se mantiene y, quizás lo más importante, para fines de secuencias de comandos, produce una salida coherente y analizable. Los siguientes son algunos enfoques similares:

Si desea la dirección IPv4 para su interfaz Ethernet eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Como un guión:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

La salida producida anteriormente está en notación CIDR. Si no se desea la notación CIDR, se puede quitar:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

Otra opción que en mi humilde opinión es "más elegante" obtiene la dirección IPv4 para cualquier interfaz que se utilice para conectarse al host remoto especificado (8.8.8.8 en este caso). Cortesía de @gatoatigrado en esta respuesta :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Como un guión:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Esto funciona perfectamente bien en un host con una sola interfaz, pero más ventajosamente también funcionará en hosts con múltiples interfaces y / o especificaciones de ruta.

Si bien ipsería mi enfoque preferido, ciertamente no es la única forma de desollar a este gato. Aquí hay otro enfoque que utiliza hostnamesi prefiere algo más fácil / más conciso:

$ hostname --all-ip-addresses | awk '{print $1}'  

O, si desea la dirección IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  

Como un guión:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379
Seamus
fuente
1

Sugiero usar una biblioteca de python como netifaces que esté específicamente diseñada para este propósito.

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Para obtener la interfaz de red predeterminada que está en uso.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
Sandeep
fuente
1

Solo una opción más que puede ser útil si no tiene awk (como es el caso en algunos dispositivos integrados):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
Fulvio Flaco
fuente
1

ifconfig eth0|grep 'inet '|awk '{print $2}'

Maksim Kostromin
fuente
1

Aquí está para IPv4 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

Aquí está para IPv4 y dev particular (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

para IPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"

XXL
fuente
0

Esto también se puede utilizar con un usuario normal.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
Matheus Baldasso
fuente
él pide eth0, esta versión de su script podría ayudar (también mostrar loopback aunque)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt
Esta es casi la misma respuesta que askubuntu.com/a/560466/367990 , solo usando cutdos veces en lugar de una combinación de awky cutpara analizar la salida. La próxima vez, primero debe consultar todas las otras respuestas y asegurarse de no publicar una solución duplicada. En este caso aquí, creo que es discutible si es un duplicado o simplemente similar, así que tómalo como una pista general. Gracias.
Byte Commander
0

Esta es la forma más corta que pude encontrar:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

Reemplazar $1 con su interfaz de red.

ip -f inet le dice a ip que solo devuelva valores para la familia inet (ipv4).

grep -Po le dice a grep que intepere el siguiente valor como perl-regex y que solo imprima los valores coincidentes.

La expresión regular \K[\d.]+dice "deseche todo hasta este punto (\ K), y combine tantos valores numéricos seguidos por un punto en una fila como sea posible". Por lo tanto, esto solo coincidirá con la dirección IP e ignorará todo lo que esté después, incluida la máscara de subred shortform \ XX.

Ryan
fuente
0

en estos días con interfaces múltiples (por ejemplo, si usa un acoplador) y la interfaz de nombres por ETH ya no es la norma

Yo uso este comando para extraer la IP / Máscara:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Entonces, independientemente de cuántas interfaces tenga y cualquiera que sea su nombre, GREP solo tomará la primera que tenga la opción MULTICAST.

Utilizo este comando para extraer solo la IP sin la máscara:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Uso estos comandos en diferentes BDS y NIX, nunca falla;)

JOduMonT
fuente
Si va a analizar la salida de ip, use la -oopción
muru
0

En mi script estoy usando algo así:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

No genera ningún proceso.

Maciej Wawrzyńczuk
fuente
0

Otra forma más (suponiendo que no quieres una CIDRdirección y quieres IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Utiliza el ip comando que no esdeprecated
  • Utiliza solo un comando para filtrar
htaccess
fuente