RSHD(8)

名前
rshd - リモートシェルのサーバ

書式
rshd [-ahlnL]

説明
rshd サーバは、 rcmd(3) ルーチンのためのサーバであり、 結果として rsh(1) プログラムを実行するためのサーバである。 このサーバは、信頼できるホストからの特権ポート番号に基づいた認証を使い、 リモート実行機能を提供する。

rshd サーバは、``cmd'' サービスの仕様で指定されているポートで、 サービス要求を待つ。 services(5) を参照すること。 サービス要求を受信すると、以下の手順を開始する:

1.  サーバは、クライアントの要求元ポートをチェックする。 要求元ポートが 512 〜 1023 の範囲にない場合、 サーバは接続を中止する。

2.  サーバは、ソケットからヌルバイト (`\0') を検出するまで文字を読み込む。 読み込んだ文字列は、 ASCII 文字からなる 10 進数の数字として解釈される。

3.  ステップ 2 で受信した数値が 0 でない場合、 標準エラー で使う 2 番目のストリームのポートとして解釈される。 そして、2 番目の接続が指定されたポートでクライアントマシン上に生成される。 この 2 番目の接続の要求元ポートも 512 〜 1023 の範囲である。

4.  サーバは、クライアントの要求元アドレスをチェックし、 対応するホスト名を要求する (gethostbyaddr(3), hosts(5), named(8) を参照すること)。 ホスト名が特定できない場合、 ドット表記法によるホストアドレスが使われる。 ホスト名がサーバと同じドメイン名のものである場合 (ドメイン名の後ろから 2 つが同じ場合)、 または -a オプションが指定されている場合、 ホスト名に対応するアドレスが要求され、 ホスト名とアドレスが対応しているかを確認する。 アドレス確認が失敗した場合、 ``Host address mismatch.'' というメッセージを出して、接続を中止する。

5.  ヌル文字で終端された最大 16 文字のユーザー名を、 最初のソケットから取得する。 ユーザー名は、 クライアント マシン上でユーザーを識別するために解釈される。

6.  ヌル文字で終端された最大 16 文字のユーザー名を、 最初のソケットから取得する。 ユーザー名は、 サーバ マシン上でユーザーを識別するために解釈される。

7.  ヌル文字で終端されたシェルに渡されるコマンドを、 最初のソケットから取得する。 コマンドの長さは、システムの引き数リストの上限に制限される。

8.  rshd は ruserok(3) を使ってユーザーを確認する。 このプログラムは /etc/hosts.equiv ファイルと、ユーザーのホームディレクトリにある .rhosts ファイルを使う。 -l オプションは、 ruserok(3) に、ユーザー ``.rhosts'' ファイルに基づいた確認を行わせない (ユーザーがスーパーユーザーである場合と、 -h オプションが使われた場合を除く)。 -h オプションが指定されない場合、 スーパーユーザーアカウントは、このサービスでは全く使われない。

    -l オプションは、 システムにインストールされている特定のバージョンの libc で 動作するかを確認せずに信用すべきではない (また、libc を更新した後もテストすべきである)。 なぜなら、libc のいくつかのバージョンでは rshd が使うフラグが信用できない。

    また、 .rhosts システムの設計は、慎重にファイアウォールで囲まれた プライベートネットワーク以外では、 「全くもって安全でない」ことに注意すること。 それ以外の環境では rshd を完全に無効にすべきである。

9.  ヌル文字のバイトが最初のソケットから返され、 コマンド行がユーザーの通常のログインシェルに渡される。 このシェルは rshd によって確立されたネットワーク接続を拒否する。

トランスポートレベルのキープアライブメッセージは、 -n オプションが指定されない限り、有効である。 キープアライブメッセージを使うと、 クライアントがクラッシュしたり到達不能になった場合に、 セッションをタイムアウトすることができる。

-L オプションを使うことで、 全ての正常なアクセスを syslogd(8) を経由して auth.info メッセージとしてログに記録できる。 また、全ての失敗したアクセスを auth.notice としてログに記録できる。

返り値
以下にリストしたもののうち最後のものを除き、 全ての診断メッセージを最初のソケットを使って返した後、 全てのネットワーク接続を閉じる。 エラーは、先頭に値 1 のバイトをつけることで示される (ログインシェル実行前の全てのステップが正常に完了した場合、 上記のステップ 9 で 0 が返される)。

Locuser too long.
    クライアントマシン上のユーザー名が、16 文字を超えている。

Ruser too long.
    リモートマシン上のユーザー名が、16 文字を超えている。

Command too long.
    渡されたコマンドラインの長さが、(システムで設定された) 引き数リストのサイズを超えている。

Remote directory.
    ホームディレクトリへの chdir コマンドが失敗した。

Permission denied.
    上で説明した認証手続きが失敗した。 または、要求されたユーザー要求が存在しなかった (これらの条件は、故意に組み合わせた)。

Can't make pipe.
    標準エラー に必要なパイプが作成できなかった。

Can't fork; try again.
    サーバによる fork が失敗した。

<shellname>: ...
    ユーザーのログインシェルを起動できなかった。 このメッセージは、 標準エラー に関係づけられた接続を経由して返されるので、 フラグバイトが前に付かない。

関連項目
rsh(1), rcmd(3), ruserok(3)

バグ
ここで使われているユーザー認証手続きは、 クライアントマシンと接続媒体が完全であることを仮定している。 これは安全ではないが、「オープンな」環境では便利である。

通信する全てのデータを暗号化する機能が提供されるべきである。

(Telnet のような) もっと拡張性のあるプロトコルが用いられるべきである。

翻訳者謝辞
この man ページの翻訳にあたり、 FreeBSD jpman project <http://www.jp.freebsd.org/man-jp/> による翻訳を参考にさせていただいた。