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