rstartd(1) リモート起動 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 が非互換性を隠蔽できることのちょっとした例である。

著者

Jordan Brown, Quarterdeck Office Systems