¿Cómo puedo obtener la dirección IP local en macOS para usarla en un script?

Necesito averiguar la dirección IP local del corredor Github, que usa macOS 11. Necesito esto para mis pruebas de integración.

Lo intenté:

LOCAL_IP=ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'
SERVER_URL="http://${LOCAL_IP}:5000"

Sin embargo, esto me dio solo:http://:5000

¿Cuál es el comando correcto para esto?

Relacionado con apple.stackexchange.com/questions/60160/… , pero las respuestas no se pueden usar fácilmente en un script.
Sé que hay muchas preguntas relacionadas, pero no encuentro ninguna respuesta para una solución basada en un script de shell.
¿Estos scripts se ejecutan en la misma máquina que el servidor? Si no, ¿el servidor está en una máquina fija?
Tengo un repositorio mono que contiene un backend de python (frasco) y una aplicación Flutter. He escrito pruebas de un extremo a otro y ahora quiero que se ejecuten en la canalización. Por lo tanto, escribí un archivo de acción de Github que inicia el backend y luego las pruebas de integración de flutter. Para esto necesito la IP del backend, que se ejecuta localmente en el corredor MacOS Github.
Tengo dos preguntas 1) ¿Realmente necesitas escribir esto como un guión? Para un descubrimiento único, sería mucho más fácil simplemente buscar en el Panel de control de red. 2) ¿Esto está dentro de la misma Mac? Si es así, siempre es 127.0.0.1.
1) Sí. Este es un corredor de Github que no tiene interfaz de usuario y no puedo conectarme a él. Todo lo que puedo hacer es ejecutar un script con acciones de Github. 2) La aplicación se ejecuta en un dispositivo virtual Android. Por lo tanto, 127.0.0.1 apunta al dispositivo virtual, no al mac donde está mi backend.
Sinceramente, no entendí nada de eso;) así que me haré a un lado.
Luego, debe consultar la documentación de la aplicación que proporciona la VM (por ejemplo, virtualbox, docker ...) y ver cómo configura su red

Respuestas (4)

LOCAL_IP=ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'

establece la variable LOCAL_IPpara ifconfigejecutar un comando vacío y envía la salida vacía de ese comando vacío a la tubería construida de | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'. Por lo tanto, LOCAL_IPnunca se establece después.

Lo que probablemente quieras ejecutar es

LOCAL_IP=$(ifconfig | grep 'inet ' | grep -Fv 127.0.0.1 | awk '{print $2}')

que se puede simplificar a

LOCAL_IP=$(ifconfig | awk '/inet /&&!/127.0.0.1/{print $2}')

Desafortunadamente, esto devolverá dos filas en las Mac que están conectadas a través de Ethernet y WLAN. Así que probablemente sea más seguro usar

LOCAL_IP=$(ifconfig | awk '/inet /&&!/127.0.0.1/{print $2;exit}')

que elegirá la primera interfaz de red/dirección IP encontrada.

La dirección IP local se puede obtener con el siguiente comando:

ipconfig getifaddr en0

o en1, según su Mac y su conexión.

No funciona para mí:/Users/runner/work/_temp/f51fbf9d-2251-420a-ad21-c16451b2e107.sh: line 4: getifaddr: command not found
@DarkMath El comando es ipconfig getifaddr en0.
@benwiggy Sí, lo intenté. Pero el corredor de Github no conoce el comando, getifaddrcomo puede ver en el mensaje de error anterior.
@DarkMath El comando para ejecutar es ipconfig, getifaddr en0son los parámetros.
RE: "o en1, dependiendo de tu Mac y tu conexión". -- O podría ser otra cosa, ya que en mi sistema actualmente es en7. Si bien en0y en1en el típico, realmente depende de qué Mac tiene uno y cómo está configurado para interactuar con la LAN.
Esto devuelve simplemente nada para mí. Sin embargo, las otras dos soluciones funcionan.

Aquí tienes otra opción que te puede ser útil.

Este comando creará una variable con la dirección IP local.

LOCAL_IP=$(osascript -e "IPv4 address of (system info)")

Este comando devolverá la dirección IP local almacenada en$LOCAL_IP

echo $LOCAL_IP
Esto es bueno, no tener que preocuparse por el nombre del dispositivo BSD del adaptador de red. +1

Puede hacerlo en Python sin proporcionar un nombre de interfaz:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'