Wie kann ich die lokale IP-Adresse in macOS zur Verwendung in einem Skript abrufen?

Ich muss die lokale IP-Adresse des Github-Runners herausfinden, der macOS 11 verwendet. Ich brauche diese für meine Integrationstests.

Ich habe es versucht:

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

Dies gab mir jedoch nur:http://:5000

Welches ist der richtige Befehl dafür?

Verwandte apple.stackexchange.com/questions/60160/… , aber die Antworten dort sind nicht einfach in einem Skript zu verwenden.
Ich weiß, dass es viele verwandte Fragen gibt, aber ich finde keine Antwort für eine Lösung, die auf Shell-Skript basiert.
Werden diese Skripts auf demselben Computer wie der Server ausgeführt? Wenn nicht, befindet sich der Server auf einer festen Maschine?
Ich habe ein Mono-Repository mit einem Python-Backend (Flask) und einer Flutter-App. Ich habe End-to-End-Tests geschrieben und möchte sie jetzt in der Pipeline ausführen. Daher habe ich eine Github-Action-Datei geschrieben, die das Backend startet und danach die Flutter-Integrationstests. Dazu benötige ich die IP des Backends, welches lokal auf dem MacOS Github Runner läuft.
Ich habe zwei Fragen 1) Müssen Sie das wirklich als Skript schreiben? Für eine einmalige Entdeckung wäre es viel einfacher, einfach in der Netzwerksystemsteuerung nachzusehen. 2) ist das im selben Mac? Wenn ja, dann immer 127.0.0.1.
1) Ja. Dies ist ein Github-Runner, der keine Benutzeroberfläche hat und mit dem ich keine Verbindung herstellen kann. Ich kann nur ein Skript mit Github-Aktionen ausführen. 2) Die App läuft auf einem virtuellen Android-Gerät. Daher zeigt 127.0.0.1 auf das virtuelle Gerät, nicht auf den Mac, auf dem sich mein Backend befindet.
Ich habe ehrlich gesagt nichts davon verstanden;) also trete ich zur Seite.
Dann müssen Sie sich die Dokumentation der App ansehen, die die VM bereitstellt (z. B. Virtualbox, Docker ...) und sehen, wie sie ihr Netzwerk einrichtet

Antworten (4)

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

legt die Variable fest LOCAL_IP, um ifconfigeinen leeren Befehl auszuführen, und sendet die leere Ausgabe dieses leeren Befehls an die Pipe, die aus | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'. Wird also LOCAL_IPnie hinterher eingestellt.

Was Sie wahrscheinlich ausführen möchten, ist

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

was vereinfacht werden kann

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

Leider gibt dies auf Macs, die sowohl über Ethernet als auch über WLAN verbunden sind, zwei Zeilen zurück. Daher ist es wahrscheinlich sicherer zu verwenden

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

Dadurch wird die erste gefundene Netzwerkschnittstelle / IP-Adresse ausgewählt.

Die lokale IP-Adresse kann mit dem folgenden Befehl abgerufen werden:

ipconfig getifaddr en0

oder en1, abhängig von Ihrem Mac und Ihrer Verbindung.

Funktioniert bei mir nicht:/Users/runner/work/_temp/f51fbf9d-2251-420a-ad21-c16451b2e107.sh: line 4: getifaddr: command not found
@DarkMath Der Befehl lautet ipconfig getifaddr en0.
@benwiggy Ja, ich habe es versucht. Aber der Github-Runner kennt den Befehl nicht, getifaddrwie Sie in der obigen Fehlermeldung sehen können.
@DarkMath Der auszuführende Befehl ist ipconfig, getifaddr en0sind die Parameter.
RE: "oder en1, abhängig von Ihrem Mac und Ihrer Verbindung." -- Oder es könnte etwas anderes sein, da es auf meinem System derzeit en7. Während en0und en1im Allgemeinen hängt es wirklich davon ab, welchen Mac man hat und wie er für die Verbindung mit dem LAN eingerichtet ist.
Das bringt mir einfach nichts. Die anderen beiden Lösungen funktionieren jedoch.

Hier ist eine weitere Option, die für Sie nützlich sein könnte.

Dieser Befehl erstellt eine Variable mit der lokalen IP-Adresse.

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

Dieser Befehl gibt die in gespeicherte lokale IP-Adresse zurück$LOCAL_IP

echo $LOCAL_IP
Das ist schön, sich nicht um den BSD-Gerätenamen des Netzwerkadapters kümmern zu müssen. +1

Sie können dies in Python tun, ohne einen Schnittstellennamen anzugeben:

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