« I, Robot | Main | 化粧惑星 »
2006年10月 5日
ネットワーク環境の切り替えもコマンドラインでしょ。
いまどきネットワークに繋がってない計算機なんて滅多にないわけで、 なぜかこのブログを見ているあなたもネットワークに繋がってるわけですね。 で、ラップトップを使っていると接続するネットワークが頻繁に変わるので、 環境に応じた設定をプロファイルとして保存しておき、 接続先によって切り替えてあげるわけです。 この仕組みはOSやハードウェアのベンダによってさまざまで、 ThinkPad+Windows XPではAccessConnectionsだったり、 OSXではネットワーク環境設定だったりします。
今回は、例によってOSXのネットワーク環境設定をコマンドラインから切り替えてあげましょう、という趣旨です。
scselectを使う
OSXにはSystem Configurationという枠組みがあって、 configdが管理しているわけですが、 こいつをいじるためには以下のようなコマンドがあります。
- configd(8)
- scutil(8)
- scselect(8)
今回使うのは一番最後のscselectです。 scという割にSystem Configurationに汎用的ななにかではなく、 ネットワーク環境を切り替えられるだけです。
さて、すでにPowerBookとかMacBookを使っている人は、 ネットワーク環境がいくつも定義されていることだと思います。 scselectを引数なしで実行すると、 定義されている環境の一覧が表示されます (下記の例は適当に削ってますが)。
$ scselect Defined sets include: (* == current set) F770774D-ABDC-4686-90ED-BBB7D686D1E4 (???) F89CD707-21C5-4121-99F3-1C6AF4805CF5 (DHCP (Wireless)) 0 (Automatic) * 0BACA6E6-9B74-4B3C-858D-79E5D2F2314D (DHCP (Wired)) 575CFD8C-1A50-42FF-B7AD-64A27CE6B611 (OFF) $
最初の十六進数の羅列が識別子で、 続く括弧の中はユーザが定義したネットワーク環境の名称です。 また、先頭にアスタリスクがついているものが現在利用中の環境です。
ネットワーク環境を切り替えるには、 scselectの引数に識別子か名称を指定します。
$ scselect F770774D-ABDC-4686-90ED-BBB7D686D1E4 CurrentSet updated to F770774D-ABDC-4686-90ED-BBB7D686D1E4 (???) $
名称が???になっているのは日本語を使っているからです。 残念ながら日本語は扱えないようなので、 こういうときは上記のように識別子を使うしかありません。 ちなみに、-nというオプションもあるようで、 これをつけると再起動時にネットワーク環境が切り替わる…らしいですが、 使ったことがないので分かりません。
以上でおしまい…というのもあんまりなので、 ついでにzshを使っている皆様へ、 scselectで補完するための定義を載せておきます。 いつも通り、fpathの通ったところに_scselectというファイル名でおいてください (正しさに責任は持てません…)。
#compdef scselect
local curcontext="$curcontext" context state line ret=1
_arguments -C \
'-n[Delay changing the next system boot]' \
'(-n)1::locations:->locations' \
&& ret=0
if [[ -n "$state" ]]; then
local tmp desc list identifiers names expl
tmp=( "${(@f)$(_call_program locations scselect 2>&1)}" )
desc="$tmp[1]"
list=( "${(@M)tmp[2,-1]:##(( |\*)#${PREFIX//\\/}*|[^(]#\(${PREFIX//\\/}*\))}" )
names=( "${(@)${(@)list#*\(}%\)}" )
identifiers=( "${(@M)${(@)list##( |\*)#}##[[:xdigit:]-]#}" )
if (( ${#list} )); then
_message -r $desc
_message -r ${(F)list}
fi
zstyle ":completion:${curcontext}:$1" sort off
_wanted locations expl 'Locations' \
compadd "$@" -n -a names identifiers && ret=0
fi
return ret