bash
Macのスクリプトで特定のWiFiネットワークに接続しようとしています。
私が達成したい2つのこと:
指定されたネットワークに接続します。これを試しましたが、
networksetup -setairportnetwork en0 [network_ID]
トップメニューバーからMacがネットワークに接続しようとしましたが、最終的に失敗したことがわかります。ネットワークに手動で接続するときにパスワードを入力する必要がないため、ネットワークはパスワードで保護されており、パスワードはキーチェーンに保存されています。接続が正常に確立されるまで、残りのスクリプトの実行を一時停止します。
どんな提案がありますか?
答え1
1) 無線ネットワークに接続
パスワードを追加したいです。しかし、passkey
私のWiFiネットワークBSSIDは私のキーチェーンにあるので、コマンドラインにキーをプレーンテキストとして直接追加するだけで、BSSIDに切り替えて正常にログインできます。他には効果がありませんでした。
ネットワーク設定 -setairportnetwork [en0] [network_BBSSID][パスワード]
2) 接続されるまでスクリプトを一時停止します。echo $?
上記のコマンドのエラーコード()を簡単にテストできます。ネットワーク設定エラーコードはマイナーではありませんので注意してください。 grep "failed"が役に立つかもしれません。
networksetup -setairportnetwork en0 mywifi mypass | grep -ic "failed"
結果があれば0あなたは大丈夫でしょう。単にWi-Fiに接続するのではなく、実際の接続を直接テストすることもできます(より良いオプションimho)。たとえば、動作していることを確認できます。ping
ネットワークまたはインターネットでホストします。これを一つに集めるべきです。while :
ループを実行すると、結果がゼロになるまでコマンドを再試行します。またはread
あなたのステートメントはスクリプトを一時停止します(あなたの質問に対する私の理解)。
最後に停止する一定時間が経過してもネットワークが接続されない場合は、ネットワーク設定を終了します。Timeoutコマンド、一部GNUコアユーティリティ役に立つかもしれません。 Brew Package Managerを介してインストールできます。brew install coreutils
。
3) 1つのライナーの提供
! 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を追加G同じ名前の既存のデフォルトユーティリティとの混同を避けるために、デフォルトではコマンドの前に付けられます。
/dev/null, 2>&-
:さまざまなコマンドの出力とエラーコードの印刷を防ぐ
read -n 1
: キーを押すまで一時停止