Quiero hacer un script grande en mi Debian 7.3 (algo así como un entorno traducido y mucho más nuevo y fácil de usar). Tengo un problema. Quiero usar solo algunas de las informaciones que me dan los comandos. Por ejemplo, mi ifconfig se ve así:
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0 inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1904 errors:0 dropped:0 overruns:0 frame:0 TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1309425 (1.2 MiB) T Quiero mostrar solo la dirección IP en línea: echo "Su dirección IP es: (IP_ADDRESS)". ¿Hay algún comando que me permita hacer tal cosa, buscar en la corriente la información que quiero obtener? Sé sobre grep y sed , pero no soy muy bueno con ellos.
Editar: En primer lugar, para decir gracias por ayudarme con este problema, ahora sé mucho más. En segundo lugar, decir que el proyecto está en progreso. Si alguien estaría interesado en él, solo mándame un mensaje privado.
Si el objetivo es encontrar la dirección IP conectada en dirección a Internet, esta debería ser una buena solución.
Edición 2021: se agregaron versiones "sed" y "grep" y nuevas versiones "awk" (algunas son gnu)
Para encontrar qué sumadores de IP se usan conectados a Internet, podemos usar el comando ip route . Con la versión más nueva de Linux, obtiene más información con un resultado típico como este:
ip route get 8.8.8.8 8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002 cacheentonces, para obtener la IP , debe encontrar la IP después de src , usando awk , sed o grep
ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}' ip route get 8.8.8.8 | awk 'match($0,/src (\S*)/,a)&&$0=a[1]' ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/src/)$0=$(i+1)}NR==1' ip route get 8.8.8.8 | sed -E 's/.*src (\S+) .*/\1/;t;d' ip route get 8.8.8.8 | sed 's/.*src \([^ ]*\).*/\1/;t;d' ip route get 8.8.8.8 | sed -nE '1{s/.*?src (\S+) .*/\1/;p}' ip route get 8.8.8.8 | grep -oP 'src \K[^ ]+' 10.36.15.150y si te gusta el nombre de la interfaz usando awk , sed o grep
ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}' ip route get 8.8.8.8 | awk 'match($0,/dev (\S*)/,a)&&$0=a[1]' ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)$0=$(i+1)}NR==1' ip route get 8.8.8.8 | sed -E 's/.*?dev (\S+) .*/\1/;t;d' ip route get 8.8.8.8 | sed 's/.*dev \([^ ]*\).*/\1/;t;d' ip route get 8.8.8.8 | sed -nE '1{s/.*?dev (\S+) .*/\1/;p}' ip route get 8.8.8.8 | grep -oP 'dev \K[^ ]+' ens192 ip route no abre ninguna conexión, solo muestra la ruta necesaria para llegar a 8.8.8.8 . 8.8.8.8 es el DNS de Google.
Si desea almacenar esto en una variable, haga lo siguiente:
my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}') my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')Por qué otra solución puede fallar:
ifconfig eth0
Hostname -I
Para obtener su dirección IP:
echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`Esto le dará la dirección IP de eth0.
Editar: debido a los cambios de nombre de las interfaces en las versiones recientes de Ubuntu, esto ya no funciona. En su lugar, podrías usar esto:
hostname --all-ip-addresses o hostname -I , que hace lo mismo (te da TODAS las direcciones IP del host).
Si desea obtener una lista separada por espacios de sus direcciones IP, puede usar el comando de nombre de hostname con el --all-ip-addresses (short -I )
hostname -Icomo se describe aquí: Poner la dirección IP en la variable bash. ¿Hay una mejor manera ?