Windows で RSHD を使う

2010年11月14日

はじめに

Windows で RSHD を使う。

RSHD の入手

Windows Implementation of RSHD

上記リンクに RSHD の説明とファイルへのリンクがあるが、最新版は こちら で手に入る。現時点での最新版は 1.8。

RSHD の起動

インストール

管理者権限で以下のコマンドを実行する。

> rshd -install

"管理ツール" の "サービス" に RSH Demon が追加される。

rhosts の用意

サービス開始前に rhosts ファイルを用意する必要がある。"C:\WINDOWS\rhosts" が読まれるようになっている (ただしバージョン 1.7 では "C:\WINDOWSrhosts" を読む。デリミタが抜けている)。

インストール時に "-r" オプションをつけていれば rhosts は無視される。

サービスの開始/停止

"管理ツール" の "サービス" で RSH Demon の開始/停止が可能。以下のようにすればコマンドラインでも行える。

> net start rshd
> net stop rshd

アンインストール

管理者権限で以下のコマンドを実行すると、"管理ツール" の "サービス" から RSH Demon が削除される。

> rshd -remove

デバッグ版

"-d" オプションつきで起動すると、デバッグ版でサービスが開始される。

> rshd -d

処理の詳しい情報を得ることができる。

RSHD サービスの利用

RSH/RCP の用意

Windows XP には標準で RSH, RCP が含まれている。Windows Vista や Windows 7 には標準では含まれない。Microsoft が提供する UNIX ベース アプリケーション用サブシステム (SUA) とやらを入れるとよいという話だが未確認。Edition によっては使えなかったりするようである。

RSH だけなら ここ で Windows Vista/Windows 7 向けに提供されている。

RSH の利用

外のマシンから RSHD サービスが起動しているマシンにコマンドを実行させる場合は、次のようにする。

> rsh host -l username command

ちなみに、ディレクトリ移動が必要なとき、ドライブ文字が変わる場合は、ドライブ切り替えが必要である。

> rsh host -l username "d: & cd d:\users & dir"

rsh 実行時の場所は、rsh で cd コマンドを実行すればわかる。

注意: ユーザー名指定には意味がないのかもしれない。コマンドは管理者権限で実行されているように見える。だとしたらかなり危険。

RCP の利用

外のマシンから RSHD サービスが起動しているマシンとファイルのやりとりを行う場合は、次のようにする。

> rcp local_file host.username:remote_path:remote_path
> rcp host.username:remote_file local_path

利用上の注意

上記 RSHD は、Windows から RSH をおよそ 1000 回以上実行するとつながらなくなる。また、Linux からの RSH でもおよそ 500 回以上実行すると動作がおかしくなる。ただし、上記の Windows Vista/Windows 7 用 RSH では問題は起こらない。

(注意: これ以降かなりアヤフヤな知識で書いています。)

Windows のソケットで connect すると、そのポートは close されようがされまいが数分間使えなくなるようだ (netstat -na で "TIME_WAIT" と表示される)。上記 RSHD はそれに対処するために、ローカルの標準エラー出力ポート番号を 1022 から接続のたびに 1 ずつ減らしている。Windows 版 RSH の場合は 1000 回ちょっとの接続でポート番号が 0 になりつながらなくなる。Linux の場合、511 から動作がおかしくなる。

ということは、ローカルの標準エラー出力ポート番号が 511 まで行った時点で 1022 に戻せばよいように思うが、あまりに処理が連続的だとはじめのポートが TIME_WAIT を抜けるほどの時間が経たず、ポートが使用中であると判断されて接続に失敗してしまう。

これに対処するには、ポートが使用中であれば接続を切るのではなく、つながるようになるまで待つという対策を施せばよい。

ちなみに上の Windows Vista/Windows 7 用 RSH については、標準エラー出力ポートの情報をちゃんと送っていないのと、あとなんかいろいろあって (?) 問題ないようである。

RSHD 修正版

rshd-1.8-1.zip

上記の考え方で修正を施した RSHD。

  • rresvport() (rshd.cpp) で ポート番号 (*alport) が循環するようにした。
  • openErrSocket() (rshd.cpp) で rshClientErr の接続に失敗したとき、ポートが使用中のためのエラーであれば接続を試み続けるようにした。

RCP for Windows

rcp-win.zip

フリーの Windows 版 RSH は上記のものがあるが、RCP はないようなので、上の RSH と RSHD をまぜこぜして作ってみた。