Help us understand the problem. What is going on with this article?

スクリプトで無線LANにWi-Fi接続する -Mac編-

More than 3 years have passed since last update.

Wi-Fiダイレクトで直接デバイスに無線接続するときに、毎回メニューバーから選ぶのが面倒なので作りました。
Yosemite 10.10.5で動作確認済みです。

wificonn_mac.sh
#!/bin/bash
set -u
export LANG="C"

function usage() {
  cat <<EOT
Usage: bash ${0##*/} <network-SSID> <password>
EOT
}

# 引数チェック
if [ $# -ne 2 ]; then usage && exit 1; fi

# Wi-Fiのデバイス名を調べる
WIFI_DEV_NAME=$(networksetup -listallhardwareports | grep -w Wi-Fi -A1 | awk '/^Device:/{ print $2 }')
if [ -z "${WIFI_DEV_NAME}" ]; then
  echo "Wi-Fi device not found!"
  exit 2
fi

# すでに接続されていれば終了
networksetup -getairportnetwork ${WIFI_DEV_NAME} | grep -wq $1
if [ $? -eq 0 ]; then
  echo 'Already connected.'
  exit 0
fi

POWER_ON_WAIT=1
# Wi-Fiの電源が入ってなければ入れる
networksetup -getairportpower ${WIFI_DEV_NAME} | grep -wiq 'off'
if [ $? -eq 0 ]; then
  networksetup -setairportpower ${WIFI_DEV_NAME} on
  if [ $? -ne 0 ]; then
    echo "Failed to power on ${WIFI_DEV_NAME}."
    exit 3
  fi
  sleep ${POWER_ON_WAIT}
fi

# airportコマンドのフルパス
AIRPORT_CMD='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport'
# 指定のSSIDを持つアクセスポイントがあるか調べる
${AIRPORT_CMD} --scan=$1 | grep -wq $1
if [ $? -ne 0 ]; then
  echo "The wi-fi network with SSID:'$1' not found."
  exit 4
fi

# 接続リトライ回数/リトライ間隔秒数
CONNECTION_RETRY=3
RETRY_INTERNAL=2
# 接続する
remain=${CONNECTION_RETRY}
while [ ${remain} -gt  0 ]
do
  # networksetup -setairportnetwork は成功時も失敗時も0を返してくるので出力で判断
  networksetup -setairportnetwork ${WIFI_DEV_NAME} $1 $2 | grep -wq 'Error'
  if [ $? -ne 0 ]; then
    break
  fi
  ((remain--))
  sleep ${RETRY_INTERNAL}
done
if [ ${remain} -eq 0 ]; then
  echo "Failed to join the network. Password may be incorrect."
  exit 5
fi

# 接続されているか念のため確認
networksetup -getairportnetwork ${WIFI_DEV_NAME} | grep -wq $1
if [ $? -ne 0 ]; then
  echo 'Something wrong occured!'
  exit 6
fi

echo 'Connected successfully.'
exit 0

使い方

$ bash wificonn_mac.sh <network-SSID> <password>

生でパスワードを打つので、共同のマシンでは注意してください。
aliasとか設定してやると幸せになれるかもしれません。

一応解説

Macでコマンドラインからネットワーク接続を設定するにはnetworksetupコマンドを使います。
networksetupには多様なサブコマンドが付属しており(数えたら119個もありました)、Wi-FiだけでなくBluetoothやThunderboltの設定もできるようです。
今回は以下のコマンドを使用しました。

コマンド 用途
networksetup -listallhardwareports 全ネットワークデバイスを表示
networksetup -getairportpower <device name> <device name>の電源のON/OFFを調べる
networksetup -setairportpower <on off> <device name>の電源をON/OFFする
networksetup -getairportnetwork <device name> <device name>の接続されているネットワークを表示する
networksetup -setairportnetwork <device name> <network> [password] <device name>をパスワード=passwordでSSID=networkのネットワークに接続する

無線ネットワークの検索(スキャン)はnetworksetupからはできず、代わりにairportコマンドを使用します。しかし、何故かairportコマンドにはパスが通っておらず、
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airportという長い長いフルパスで呼びだす必要があります。
今回は--scan=<network-SSID>として検索対象のネットワークを指定しましたが、単に--scanとすれば周囲の全てのネットワークの検索結果を返します。接続したいネットワークが複数ある場合はオプション無しで実行すると良いでしょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした