bash
Ich versuche in einem Skript auf einem Mac eine Verbindung zu einem bestimmten WLAN-Netzwerk herzustellen .
Zwei Dinge, die ich erreichen möchte:
Mit dem angegebenen Netzwerk verbinden. Ich habe es versucht
networksetup -setairportnetwork en0 [network_ID]
und konnte in der oberen Menüleiste sehen, dass der Mac versucht, eine Verbindung zum Netzwerk herzustellen, aber letztendlich ist es fehlgeschlagen. Ich sollte beachten, dass das Netzwerk kennwortgeschützt ist und das Kennwort im Schlüsselbund gespeichert ist, sodass ich es nicht eingeben muss, wenn ich diesem Netzwerk manuell beitrete.Unterbrechen Sie die Ausführung des restlichen Skripts, bis die Verbindung erfolgreich hergestellt wurde.
Irgendein Vorschlag?
Antwort1
1) Drahtloses Netzwerk verbinden
Sie möchten Ihr Passwort hinzufügen. Obwohl diepasskey
denn die BSSID meines WLAN-Netzwerks befand sich in meinem Schlüsselbund. Ich konnte nur dorthin wechseln und mich erfolgreich anmelden, indem ich den Passkey im Klartext direkt in die Befehlszeile eingab. Sonst hat nichts funktioniert.
Netzwerkeinstellung -setairportnetwork [en0] [Netzwerk_BBSSID][Passwort]
2) Skript anhalten, bis eine Verbindung besteht
Sie können einfach den Fehlercode des obigen Befehls testen ( echo $?
). Seien Sie vorsichtig, da Netzwerksetup-Fehlercodes nicht trivial sind. Das Suchen nach „fehlgeschlagen“ kann hilfreich sein:
networksetup -setairportnetwork en0 mywifi mypass | grep -ic "failed"
wenn das Ergebnis0Sie sollten gut sein. Sie können auch direkt auf die tatsächliche Konnektivität testen, anstatt sich einfach mit dem WLAN zu verbinden (meiner Meinung nach die bessere Option), z. B. können Sie überprüfen, ob Sieping
ein Host in Ihrem Netzwerk oder im Internet. Sie sollten all dies in einemwhile :
Schleife, die den Befehl wiederholt, bis das Ergebnis 0 ist. Oder Sie können eineread
Anweisung zu Ihrem Befehl, die das Skript anhält (so verstehe ich Ihre Frage).
Zuletzt möchten Sie vielleicht noch einAuszeitum das Netzwerk-Setup zu beenden, falls nach einer Weile kein Netzwerk verbunden wird: Timeout-Befehl, Teil vonGNU-Coreutilskann nützlich sein. Es kann über den Brew-Paketmanager installiert werden:brew install coreutils
.
3) Einzeiler-Vorschlag
! gtimeout 10s networksetup -setairportnetwork en0 mywifi mypass >/dev/null && echo 1 || { ping -oq www.apple.com 2>&- >/dev/null && echo "Connected" || read -n1 -r -p "Connection failed. Press any key to continue..." ; } ;
gtimeout
: gnutls fügt dieGPräfix standardmäßig zu seinen Befehlen, um eine Verwechslung mit vorhandenen Standard-Dienstprogrammen gleichen Namens zu vermeiden
/dev/null, 2>&-
: Vermeiden Sie das Drucken der Ausgaben und Fehlercodes der verschiedenen Befehle
read -n 1
: pausieren bis Tastendruck