« I, Robot | Main | 化粧惑星 »

2006年10月 5日

ネットワーク環境の切り替えもコマンドラインでしょ。

[ カテゴリ: MacOSX ]

いまどきネットワークに繋がってない計算機なんて滅多にないわけで、 なぜかこのブログを見ているあなたもネットワークに繋がってるわけですね。 で、ラップトップを使っていると接続するネットワークが頻繁に変わるので、 環境に応じた設定をプロファイルとして保存しておき、 接続先によって切り替えてあげるわけです。 この仕組みは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

Comments

Post a comment




Remember Me?