osx - saber - Parse ifconfig para obtener solo mi dirección IP usando Bash
ver ip en linux (19)
Quiero editar el archivo bashrc para tener una función simple llamada "myip" para ejecutar. Como se puede adivinar, la función myip solo imprime mi dirección IP interna de mi máquina.
Mientras más trabajo, este es el guión:
ifconfig en1 | awk ''{ print $2}'' | sort
Lo cual obtuvo mi resultado:
10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active
Estoy trabajando en Mac OS X.
¿Cómo puedo hacer esto?
No es necesario realizar un análisis de ifconfig no transportable en Bash. Es un trampolín trivial en Python:
python -c ''import socket; print(socket.gethostbyname(socket.gethostname()))''
Si estás buscando solo "inet" y no "inet6", esto funciona para mí:
/usr/bin/ifconfig eth0 | grep --word-regexp inet | awk ''{print $2}''
"--word-regexp" hará que grep busque la palabra completa "inet" y no coincida con los parciales de las palabras, es decir, "inet" no coincidirá con "inet6" - "inet" solo coincidirá con las líneas con "inet" en ellas .
Similar a JSR, pero con awk
y cut
en orden inverso:
my_ip=$(ifconfig en1 | grep ''inet addr'' | awk ''{print $2}'' | cut -d: -f 2)
echo ${my_ip}
Esto funciona para mí:
ifconfig eth0 | awk ''/inet addr/{print substr($2,6)}''
Código que trabaja en VDS / VPS también:
ifconfig | grep -A2 "venet0:0/|eth0" | grep ''inet addr:'' | sed -r ''s/.*inet addr:([^ ]+).*//1/'' | head -1
o
ifconfig | grep ''inet addr:'' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d '' ''
ifconfig eth0 | awk ''/inet addr/{sub("addr:",""); print $2}''
Hay otra manera fácil de separar la dirección IP del análisis ifconfig.
hostname -I -I, --all-ip-addresses all addresses for the host -i, --ip-address addresses for the hostname
Ref: http://linux.die.net/man/1/hostname
Ejemplo:
[ec2-user @ terraform ~] $ hostname -I
10.10.10.10
Tomando la respuesta del parche , haciéndolo un poco más general,
es decir: omitiendo todo hasta el primer dígito.
ifconfig eth0 | awk ''/inet addr/{sub(/[^0-9]*/,""); print $1}''
O mejor:
ifconfig eth0 | awk ''/inet /{sub(/[^0-9]*/,""); print $1}''
- Tenga en cuenta que la parte de impresión al final - cambia de $ 2 a $ 1 .
Usando Perl Regex:
ifconfig eth0 | grep -oP ''(?<= inet addr:)[^ ]+''
Explicación: grep -oP busca una coincidencia EXACTA usando Perl regex.
La parte "engañosa" es la expresión regular en sí misma;
1. (?<= inet addr:)
significa que la cadena inet addr:
está a la IZQUIERDA de lo que estamos buscando.
2. [^ ]+
(observe el espacio después del ^) - significa buscar todo hasta el primer espacio en blanco - en nuestro caso es la dirección IP.
Ambos el siguiente trabajo aquí (CentOS 5).
ip addr show eth0 | awk ''$1 == "inet" {gsub(///.*$/, "", $2); print $2}''
ifconfig eth0 | awk ''/inet addr/ {gsub("addr:", "", $2); print $2}''
Para OS X ( v10.11 (El Capitan) al menos):
ifconfig en0 | awk ''$1 == "inet" {print $2}''
Bueno, después de horas de luchar finalmente lo hice bien:
ifconfig en1 | awk ''{ print $2}'' | grep -E -o "([0-9]{1,3}[/.]){3}[0-9]{1,3}"
La última parte que me faltaba era simplemente un patrón de direcciones IP de mi lista.
En caso de eth0, lo siguiente funciona para mí. Intenta ajustarlo con la misma lógica.
ifconfig eth0 | grep ''inet addr:'' | cut -d: -f2 | awk ''{ print $1}''
Este código genera direcciones IP para todas las conexiones de red (excepto loopback) y es portátil entre la mayoría de las versiones de OS X y Linux .
Es particularmente útil para scripts que se ejecutan en máquinas donde:
- El adaptador de red activo es desconocido,
- portátiles que cambian entre Wi-Fi y conexiones Ethernet, y
- máquinas con múltiples conexiones de red.
El script es:
/sbin/ifconfig -a | awk ''/(cast)/ {print $2}'' | cut -d: -f2
Esto se puede asignar a una variable en un script como este:
myip=$(/sbin/ifconfig -a | awk ''/(cast)/ {print $2}'' | cut -d: -f2)
Los scripts pueden manejar posibles direcciones múltiples usando un bucle para procesar los resultados, así:
if [[ -n $myip ]]; then
count=0
for i in $myip; do
myips[count]=$i # Or process as desired
((++count))
done
numIPaddresses=$count # Optional parameter, if wanted
fi
Notas:
- Filtra ''ifconfig'' en "cast", ya que tiene el efecto adicional de filtrar direcciones de bucle invertido y también funciona en la mayoría de las versiones de OS X y Linux.
- La función final de ''corte'' es necesaria para una función adecuada en Linux, pero no para OS X. Sin embargo, no afecta los resultados de OS X, por lo que queda para la portabilidad.
Más simple:
hostname -I|cut -d" " -f 1
192.168.1.6
¿Qué dispositivo es?
Si no sabe si es eth0, eth1, enp0s23 o wpxxx, puede usar el comando hostname y descubrir qué dispositivo lo tiene:
ip a | awk ''BEGIN{ "hostname -I|cut -d/" /" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF " IP: "$2}''
192.168.3.5
¿Dirección IP de red?
Ahora, realmente, si quieres la dirección IP de tu red, puedes hacer algo como esto:
wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d /< -f1
49.21.123.14
Puede usar awk
para hacer tanto la selección de la línea de entrada como el análisis sintáctico de la dirección IP de esta manera:
$ ip addr ls docker0 | awk ''/inet / {print $2}'' | cut -d"/" -f1
172.17.42.1
En el ejemplo anterior, sustituya el identificador eth0
del dispositivo por docker0
. Además, si desea una implementación pura de AWK , puede hacer el "corte" dentro de la siguiente manera:
$ ip addr ls docker0 | awk ''/inet / {split($2, ary, ////); print ary[1]}''
172.17.42.1
Un simple ejemplo de script AWK + Bash que puede dar una idea general de cómo analizar el resultado del comando y mezclar sintaxis.
El código completo está en: https://gist.github.com/darkphase/67d7ec22d47dbebd329e
BEGIN { RS = "" ; FS = "/n" } # Change separator characters
{
while ( "''"$cmd"''" | getline ){
# print $0
if ( $1 !~ /LOOPBACK/ ){
split($1,arr," ")
print "''"$blue"''"arr[1]"''"$reset"''"
for(i = 1; i <= NF; i++) { # Loop through fields (this case lines)
split($i,arr," ")
switch ( arr[1] ) {
case "inet":
print "''"$red"''" "IPV4:" "''"$reset"''" "/n IP: " "''"$yellow"''" arr[2] "''"$reset"''" "/n NM: "arr[4]"/n BC: "arr[6]
break
case "inet6":
print "''"$red"''" "IPV6:" "''"$reset"''" "/n IP: "arr[2]"/n PL: "arr[4]
break
case "ether":
print "''"$red"''" "MAC: " "''"$reset"''" arr[2]
break
default:
}
}
print ""
}
}
}''
Utilizar:
ifconfig enops3 | greb broadcast | cut -d " " -f10
Donde enops3
es el nombre de la interfaz.
Después de probar algunas soluciones, considero que esta es la más útil, agréguela a su alias:
alias iconfig=''ifconfig | awk ''/'''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}''/'''|egrep "en|lo|inet"''
la salida se ve así:
shady@Shadys-MacBook-Pro:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255
Esta es la forma más "agnóstica " de obtener la dirección IP, independientemente de su sistema * nix (Mac OS, Linux), nombre de la interfaz e incluso su configuración de configuración regional:
ifconfig | grep -E "([0-9]{1,3}/.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk ''{ print $2 }'' | cut -f2 -d:
Si tiene más de una dirección IP activa, listará cada una en una línea separada. Si solo desea la primera IP, agregue | head -n1
| head -n1
a la expresión:
ifconfig | grep -E "([0-9]{1,3}/.){3}[0-9]{1,3}" /
| grep -v 127.0.0.1 | awk ''{ print $2 }'' | cut -f2 -d: | head -n1
Y si desea la dirección IP de una interfaz específica, reemplace la primera expresión ifconfig
por ifconfig INTERFACENAME
, por ejemplo ifconfig eth0 | grep -E ...
ifconfig eth0 | grep -E ...
Estos son algunos ejemplos mencionados en esta página que fallan en algunas circunstancias y por qué:
-
ip route ...
: el comandoip
no está instalado en las máquinas OSX. -
hostname -I
: la opción-I
no es válida en OSX. -
ifconfig en0 ...
: los nombres de las interfaces (eth0
,en0
) son diferentes en Linux y OSX, y en Linux el nombre depende también del tipo de interfaz ( ethX para conexión ethernet, wlanX para inalámbrico, etc.). -
python -c ''import socket; print(socket.gethostbyname(socket.gethostname()))''
python -c ''import socket; print(socket.gethostbyname(socket.gethostname()))''
: esto me consiguió127.0.1.1
(una IP loopback ) en Ubuntu Linux 14.04, por lo que no funciona. -
ifconfig | grep ''inet addr:'' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d '' ''
ifconfig | grep ''inet addr:'' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d '' ''
: la publicación de Geograph es la más cercana, pero no funciona en algunas distribuciones de Linux sinLANG=en
configurada, porque el textoinet addr:
quegrep
busca se imprime con un texto diferente en otras configuraciones regionales , y en Mac OS esa etiqueta también es diferente.
también puedes probar esto
user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk ''{ print $1}''
user@linux:~$
Salida
user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$
Tenga en cuenta que la salida ifconfig puede ser diferente dependiendo de su versión de Linux. Por lo tanto, es posible que desee cambiar la secuencia de comandos en consecuencia.
Por cierto, esta es mi salida ifconfig
user@linux:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:10
inet addr:192.168.1.1 Bcast:192.168.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112 errors:0 dropped:0 overruns:0 frame:0
TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14616 (14.2 KiB) TX bytes:17776 (17.3 KiB)
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:11
inet addr:10.0.1.1 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
user@linux:~$