Respuestas:
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
grep "inet"
En aras de proporcionar otra opción, puede utilizar el ip addr
comando 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)
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.
ip addr show label 'enp*'
más, pero me molesta analizar, algo así ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
puede funcionar ... qué bonito
La respuesta de @ markus-lindberg es mi favorita. Si agrega -o -4
a 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 }'
-o
significa --oneline
, que está destinado a ayudar en exactamente este tipo de situaciones. Se -4
agrega para limitar la dirección IPv4, que es lo que implican todas las otras respuestas.
ip
banderas. Uso cut
de awk
hechicería en lugar de avanzada :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
mucho después de enterarme awk
, y me gusta minimizar la cantidad de comandos en mis tuberías. Buena sugerencia en cualquier caso.
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+'
\K
descarta 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.
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 ip
sería mi enfoque preferido, ciertamente no es la única forma de desollar a este gato. Aquí hay otro enfoque que utiliza hostname
si 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
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Este único uso ip addr
que es un reemplazo ifconfig
y se awk
combina con la sustitución (gsub).
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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
Esto también se puede utilizar con un usuario normal.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
dos veces en lugar de una combinación de awk
y cut
para 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.
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.
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;)
ip
, use la -o
opción
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.