rstartd - リモート起動 rsh
補助プログラムのサンプル実装
rstartd
rstartd.real [-c
configfilename]
rstartd は "A Flexible Remote Execution Protocol Based on
rsh"
文書で定義されているリモート起動「補助プログラム」の実装である。
この文書は
rstartd
の特徴と設定の方法を説明する。
オプション¶
- -c configfilename
- このオプションは、rstartd
が読み込む「グローバル」な設定ファイル
を指定する。通常
rstartd は、 rstartd.real に -c
オプ
ションを付けて起動するシェルスクリプトである。このオプションを使うと、
設定ファイルの位置をローカル指定することができる。
rstartd.real を -c
オプション無しで起動した場合、このプログラムは
<XRoot>/lib/X11/rstart/config
を読み込む。ここで、<XRoot>
は X11 をイ
ンストールした先である。
インストール¶
リモート起動プロトコルでうまく操作を行うためには、
rstartd を「デ
フォルト」のサーチパスに含まれるディレクトリにインストールすることが重
要である。これにより、デフォルトの
rsh
リクエストやこれと同種のリクエ
ストがこれを見つけることが可能になる。
設定と操作¶
rstartd
は非常に細かい設定ができる設計になっている。
ユーザや管理者が探さないでも場所がわかるため、設定ファイルの位置を固定
にすることが好まれる場合もあるが、実際には異なるベンダ間ではファイル
をどこに置くか合意できないし、誰も元々の位置が「正しい」とは思わない。
従って
rstartd
ではファイルやディレクトリは
全て場所を変え
られるようになっている。
rstartd
は設定ファイルの階層を持っており、これらはリクエストが行
われた順に実行される。設定には以下のようなものがある:
グローバルな設定
ユーザ別の(「ローカルな」)設定
グローバルなコンテクストごとの設定
ユーザ別の(「ローカルの」)コンテクストごとの設定
リクエストからの設定
「リクエストからの設定」があることから考えられるように、全ての設定ファ
イルのフォーマットは
rstart
リクエストのものである。
設定を指定するため、
rstartd は INTERNAL-
プレフィックスを付けた
追加のキーワードをいくつか定義している。
rstartd
は起動時にグローバルの設定ファイルを読み込んで実行する。
通常、このファイルは他の設定ファイルの場所とシステム全体のデフォルト値
を指定する。
その後、
rstartd
はユーザのローカル定義ファイルを読む。このデフォ
ルトの名前は $HOME/.rstart
である。
それから、
rstartd
はリクエストの解釈を始める。
おそらく、リクエストの最初の行の1つは
CONTEXT 行になるだろう。
コンテクスト名は小文字に変換される。
rstartd
はコンテクストに対するグローバルの設定ファイルを読み込む。
そのデフォルトの名前は(もしあるならば)
<XRoot>/lib/X11/rstart/contexts/<name>である。
さらにコンテクストに対するユーザの設定を読み込む。そのデフォルトの名前
は(もしあるならば)$HOME/.rstart.contexts/<name>である。
(どちらも存在しなければ、
rstartd
はエラーメッセージを出力して異
常終了する。)
rstartd
はリクエストの解釈を終え、指定されたプログラムを実行する。
これにより、システム管理者とユーザは
rstartd
の操作の大部分が可
能となる。管理者は最終的な権限を持っている。なぜならば、グローバルの設
定ファイルはユーザ別の設定ファイルを指定する必要はないからである。
しかし、これを行うと、ユーザはグローバルの設定ファイルを上書きすること
ができ、グローバルのコンテクスト設定ファイルを完全に置き換えることさえ
できてしまう。
設定ファイルは、リクエストよりもいくぶん柔軟なフォーマットを持つ。
すなわち、空行を含めることができるし、"#"
で始まる行はコメントとして無視さ
れる(行の途中の "#"
はコメントの印ではなくデータである)。
実行される任意のコマンドには、役立つ情報がいくつか環境変数として与えら
れる。正確な名前は設定変更することも可能であるが、デフォルトのものは以
下である:
$RSTART_CONTEXT コンテクストの名前
$RSTART_GLOBAL_CONTEXTS グローバルなコンテクストディレクトリ
$RSTART_LOCAL_CONTEXTS ローカルのコンテクストディレクトリ
$RSTART_GLOBAL_COMMANDS グローバルの一般的コマンドディレクトリ
$RSTART_LOCAL_COMMANDS ローカルの一般的コマンドディレクトリ
$RSTART_{GLOBAL,LOCAL}_CONTEXTS
は1つの特別なファイルである
@List を持
たなければならない。このファイルは、そのディレクトリにあり、
ListContexts
に対して指定されたフォーマットのコンテクストのリストを持
たなければならない。与えられたバージョンの
ListContexts は @List のグ
ローバルとローカル両方のコピーを出力する。
一般的なコマンドはいくつかの場所で検索される:(括弧内はデフォルト)
ユーザ別のコンテクストごとのコンテクストディレクトリ($HOME/.rstart.commands/<context>)
グローバルのコンテクストごとのディレクトリ(<XRoot>/lib/X11/rstart/commands/<context>)
ユーザ別の全コンテクストディクレトリ ($HOME/.rstart.commands)
グローバルの全コンテクストディクレトリ (<XRoot>/lib/X11/rstart/commands)
(つまり、名前がコンテクストと同じである、全コンテクストの一般的コマン
ドは持つことができない。これは大きな問題ではないだろう。)
これらのディレクトリのそれぞれは
@List
というファイルを持つ。このファ
イルは、そのディレクトリにあり、ListGenericCommands
に対して指定された
フォーマットでコマンドの名前と説明を与える。
設定のキーワード¶
rstartd
の設定のために定義された「特別な」
rstart のキーワー
ドがいくつかある。別途指定されない限り、デフォルト値は存在しない。この
場合には関連する機能は無効にされる。
- INTERNAL-REGISTRIES name ...
- このシステムが認識できる、空白文字区切りの「その他」の登録リストを与え
る。(これ以外の登録も認められるが、警告が出力される)
- INTERNAL-LOCAL-DEFAULT relative_filename
- ユーザ別の設定ファイルの名前($HOME
からの相対パス)を与える。
- INTERNAL-GLOBAL-CONTEXTS
absolute_directory_name
- システム全体のコンテクストディレクトリの名前を与える。
- INTERNAL-LOCAL-CONTEXTS relative_directory_name
- ユーザ別のコンテクストディレクトリの名前($HOME
からの相対パス)を与える。
- INTERNAL-GLOBAL-COMMANDS
absolute_directory_name
- システム全体の一般的なコマンドディレクトリの名前を与える。
- INTERNAL-LOCAL-COMMANDS relative_directory_name
- ユーザ別の一般的なコマンドディレクトリの名前($HOME
からの相対パス)を与
える。
- INTERNAL-VARIABLE-PREFIX prefix
- rstartd
が子プロセスに渡す設定に関する環境変数に付けるプレフィッ
クスを与える。
- INTERNAL-AUTH-PROGRAM authscheme program argv[0] argv[1]
...
- 指定された認証方法に対して認証を行うために実行するプログラムを指定する。
"program argv[0] ..."
は実行するプログラムとその引き数であり、EXEC
キー
ワードと同じ形式である。
- INTERNAL-AUTH-INPUT authscheme
- 認証プログラムに標準入力として渡すデータを指定する。引き数のそれぞれは
一行で渡される。 $n (n
は数値)は、"AUTH authscheme arg1 arg2
..." 行の n
番目の引き数に
置き換えられる。
- INTERNAL-PRINT arbitrary text
- 引き数をデバッグ情報として出力する。rstartd
のデバッグに使われる
場合がほとんどであるが、設定ファイルのデバッグにも使うことができる。
C
シェルを使う場合や、シェルの起動時に必ずスクリプトを起動するシェルを
使う場合には、スクリプトは複数回実行されることがある。
最悪の場合、スクリプトは
3回実行される。
rstartd を実行するときに、rsh が実行する
指定されたコマンドを実行するとき、 rstartd が実行する
xterm 等のコマンドが実行する
現在の
rstartd
では、行の長さに制限がある。制限は、設定ファイル
もリクエストも BUFSIZ
バイトである。
DETACH
は、ファイルデスクリプタ
0, 1, 2 を /dev/null
にリダイレクトし、
プログラムを実行する前に
fork
することによって実装されている。
CMD は $SHELL (デフォルトでは
/bin/sh) に "-c"
オプションを付け、指定
されたコマンドを引き数として起動することによって実装されている。
POSIX-UMASK
は普通に実装されている。
認証プログラムは、対象のプログラムと同じコンテクスト(同じ環境変数、パ
ス等)で実行される。これが長すぎると問題を起こすことがある。
X
のコンテクストでは、GENERIC-CMD
Terminal は xterm を起動する。
OpenWindows
のコンテクストでは、GENERIC-CMD
Terminal は cmdtools を起 動する。
X
のコンテクストでは、GENERIC-CMD
LoadMonitor は xload を起動する。
OpenWindows
のコンテクストでは、GENERIC-CMD
LoadMonitor は perfmeter
を起動する。
GENERIC-CMD ListContexts
は、システム全体とユーザ別のコンテクス
トディレクトリにある
@List
の内容を列挙する。これは全てのコンテクスト
で利用できる。
GENERIC-CMD ListGenericCommands
は、システム全体とユーザ別のコマ
ンドディレクトリにある
@List
の内容を列挙する。これは現在のコンテクス
トに対するコンテクストごとのサブディレクトリも含む。これは全てのコンテ
クストで利用できる。
CONTEXT None
は実装されていない。
CONTEXT Default は使いにくい。
インストールを簡単にするため、ディストリビューションの「コンテクスト」
ディレクトリには、そのコンテクストに対するコンテクスト名とエイリアスを
列挙した "@Aliases"
ファイルがある。
このファイルを使って、コンテクストディレクトリとコマンドディレクトリで
シンボリックリンクを作る。
MISC
の値の全ては、変更されずに環境変数として渡される。
色々な方法で
rstartd
を酷使すると、おかしな挙動からコアダンプま
で色々な現象が起こることがある。明示的にプログラムを実行しない限り、ファ
イルを書いたり消したりすることはないはずであるが、これは保証の限りでは
ない。
rstartd は
(a)「本当に」変なことはしないし
(b)ユーザの権限で動作する
ので、最悪の事態は起こらない点は重要である。
@List
ファイルは完全である必要はない。役に立たなかったり、必要がなかっ
たり、告知してはならないコンテクストやコマンドは列挙する必要はない。
特に、ユーザ別の @List
はファイルは、システム全体の
@List ファイルに含
まれているものを列挙してはならない。将来的には、システム全体のファイル
からの行を置き換えるユーザ別の指定があったとき、ListContexts
と ListGenericCommands
はシステム全体からの行を自動的に無視するようになる
だろう。
エラー処理は弱い。特に、exec
そのものにおけるエラーの適切な通知は行お
うともしない。(どうしようもないことに、exec
のエラーは切り離すときには
確実に通知することができるが、標準入力/出力のソケットをアプリケーショ
ンに渡すときにはできない。)
-DODT1_DISPLAY_HACK
オプションを付けてコンパイルした場合には、
rstartd は SCO ODT バージョン 1
のバグを回避する動作を行う。(こ
のバグは、X
クライアントが全て誤ったライブラリでコンパイルされているた
めに、DNS
を使ってホスト名を引くことができないというものである。
この修正方法は、環境変数の
$DISPLAY を調べ、IP
アドレスに差し替えるこ
とである。) これは、
rstart
が非互換性を隠蔽できることのちょっとした例である。
関連項目¶
rstart(1),
rsh(1), A Flexible Remote Execution Protocol Based on
rsh
Jordan Brown, Quarterdeck Office Systems