サン・マイクロシステムズ(あ、今は Oracle か。。)の SunRay2 というシンクライアントを使ってます。
概要として一般ユーザのトークンはキオクスモードで Sun Ray Connector for Windows(uttsc) を使って Window ターミナルサーバに接続するというものです。
(エンドユーザは慣れたWindows上で作業出来るし、情報漏えいの心配はないし、膨大な数のPC管理も不必要となるので、IT管理者にとってはうれしい仕組みです。ただ、ターミナルサーバ側で膨大なスペックとTS CALが要求されますが。。。)
で、今回 Sun Ray Server へのセッションが確立された段階で、トークン情報に基づいて接続する Windows Server を切りかえるという必要が発生しました。
これは uttsc への引数によりどのサーバにつなぐか切り替えれるようです。
ということで、ブラウザからSunRay管理コンソール(SunRayAdministrator)を表示し、「詳細」タブの「キオスクモード」で、セッションを「Sun Ray Connector for Windows OS」となっていることを確認後、引数を追加します。
引数にはシェルスクリプトを指定し、トークンのその他の情報に基づいてサーバのIPを返答するにしました。
uttsc への引数はこんな感じです。
-m -l ja:IME -u `/opt/userget.sh` `/opt/chgserver.sh`
すで引数には別のスクリプトが指定してます。
それは、Windows ログイン名を自動指定する引数です。
Windowsのアカウントも SunRay スマートカードのユーザ名と同じにしてるので、トークン情報よりユーザ名を抜き出します。
その部分のスクリプトはこんな感じです。(/opt/userget.sh)
/opt/SUNWut/sbin/utuser -p "$SUN_SUNRAY_TOKEN"|/usr/bin/grep 'User Name'|/usr/bin/awk '{print $4}'
SunRayコマンド管理ツールの utuser -p でトークン情報を取得し、 UserName のある列の4つ目の要素をとっていますね。
で、本題のトークン「その他の情報」に基づいてサーバを切り替えるスクリプトです。(/opt/chgserver.sh)(このスクリプトはメンテナンス会社がよこしたものです)
#!/bin/csh
if(`/opt/SUNWut/sbin/utuser -p $SUN_SUNRAY_TOKEN | /usr/bin/nawk '/Other Info/ {print $4}'` == server1 ) then
echo 10.0.0.10
else
echo 10.0.0.11
ndif
トークンの「その他の情報」が server1 という文字列なら 10.0.0.10 のターミナルサーバにつなぐというものです。
で、この状態で運用を始めると Windows ターミナルサーバにつなげないユーザが出てきました。
サーバの message ログをみるとこんな感じでした。
kiosk:uttsc[000]: [ID 000000 user.notice] Usage:
kiosk:uttsc[000]: [ID 000000 user.notice]
kiosk:uttsc[000]: [ID 000000 user.notice] uttsc [-a [-c ]] [-C]
kiosk:uttsc[000]: [ID 000000 user.notice] [-k ] [-l ] [-E ]
kiosk:uttsc[000]: [ID 000000 user.notice] [-m [-b] | -K | -g [+|-+|-]
kiosk:uttsc[000]: [ID 000000 user.notice] [-K]] [-x ] [-P port] [-O] [-n client name ]
kiosk:uttsc[000]: [ID 000000 user.notice] [-u [-d ] [-p | -i]] [-z] [-A ]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r comport:=,=...]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r printer:[=]...]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r disk:=,=...]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r sound:low|high|off]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r scard:on] [-s] [-t Connection Timeout in Sec] [-B]
kiosk:uttsc[000]: [ID 000000 user.notice] [-T window title ]
kiosk:uttsc[000]: [ID 000000 user.notice] uttsc -v
kiosk:uttsc[000]: [ID 000000 user.notice] uttsc -h
kiosk:uttsc[000]: [ID 000000 user.notice] kill: 18052: アクセス権がありません
kiosk:uttsc[205]: [ID 000000 user.error] /opt/SUNWuttsc/bin/uttsc exited with error code 1 - exiting
どうやら uttsc への引数が正しくないようです。
いろいろ調査した結果「その他の情報」に空白があるトークンの場合に失敗してるっぽいです。
(「その他の情報」には文字通り、補足情報を入れて運用してました。)
nawk 使ってる所で、空白等特殊文字があると csh は指定があいまいとかって怒るようです。
さて、これをどうすればいいかというと、下記のようなシェル書いてみました。
#!/bin/sh
PRAM=`/opt/SUNWut/sbin/utuser -p $SUN_SUNRAY_TOKEN | grep 'Other Info' | sed 's/Other Info//g' | sed 's/[ , ,=]//g'`
if [ "$PRAM" = server1 ] ;
then
echo 10.0.0.10
else
echo 10.0.0.11
fi
grepで検索してsedでおきかえるっていう単純なものです。
cshは使ったことないんで、普通に sh にしてます。
補足ですが、utuser -p で返る情報はこんな形式です。
bash-3.00# /opt/SUNWut/sbin/utuser -p トークン情報
Current Properties:
User Name = username
Other Info = その他の情報 ←今回ここに空白がある場合に、シェルで怒られた
Server Name = localhost
Server Port = xxxx
Logical Token = xxxx
User Created = 01/01/2010 01:00:00
Session Type = kiosk
Token Enabled?
---------------------------------------- --------
トークン情報 Yes
Currently Logged In:
Current Desktop = xxxxx
Desktop Location =
Logged In Since = 01/01/2010 01:00:00