Mac で bash 経由で指定した WiFi ネットワークに切り替える

Mac で bash 経由で指定した WiFi ネットワークに切り替える

bashMac 上のスクリプトで特定の WiFi ネットワークに接続しようとします。

私が達成したいことは2つあります。

  1. 指定されたネットワークに接続します。 を試してみましたnetworksetup -setairportnetwork en0 [network_ID]が、Mac がネットワークに接続しようとしていることが上部のメニュー バーから確認できましたが、最終的には失敗しました。ネットワークはパスワードで保護されており、手動でこのネットワークに参加するときにパスワードを入力する必要がないため、パスワードはキーチェーンに保存されていることに注意してください。

  2. 接続が正常に確立されるまで、スクリプトの残りの部分の実行を一時停止します。

なにか提案を?

答え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: キーが押されるまで一時停止

関連情報