rshを使ってリモートホスト上でコマンド実行

FreeBSDのホームディレクトリを旧ノートPCから新ノートPCの環境へコピーするため rsh を利用したが、ちょっと問題が起きたのでメモ。

ホームディレクトリが80GBくらいあり、なるべく高速にコピーしたいので、ssh ではなく rsh を利用して、新PC側から下記のように実行したい。

rsh 192.168.0.2 tar cf - . | tar xvf -

ここで、192.168.0.2 は旧PC(リモートホスト)のIPアドレス。新PCはNATの下に繋いでいるが、旧PCから見ると 192.168.0.3 から繋がって来るように見える環境。

準備として、/etc/inetd.conf の下記の行を有効にして /etc/rc.d/inetd onestart

shell   stream  tcp     nowait  root    /usr/libexec/rshd       rshd
login   stream  tcp     nowait  root    /usr/libexec/rlogind    rlogind

また、旧PCの ~/.rhosts に、新PCのIPアドレスを追記しておく。

192.168.0.3

これで試したがうまく接続できない。正確には下記の一つ目のようにしてログインすることはできるが、二つ目の例のようにリモートホスト上で何かコマンドを実行しようとすると接続できない。

rsh 192.168.0.2
rsh 192.168.0.2 ls

tcpdump でパケットを覗いてみると…
前者は 513/TCP を使い rlogind が応答して接続できるが、後者は 514/TCP を使い rshd が応答している。
そして、rshd に繋がったあと、rshdが逆向きのTCPセッションを張ろうとしている様子。man rshd をよく眺めてみると、STDERR の内容を送るために逆向きのTCPセッションを張るらしい。今まで知らなかった。
新PCをNAT環境下に置いていたので、この逆向きのTCPが張れなかったのが原因。(実はFreeBSDVMwareのゲストOSとして動かし、VMwareのNAT配下に置いていた)。というわけで、VMware の NAT接続を止めて、ブジッジ接続にしてやると無事に解決。

それにしても、rsh ってこんなプロトコルになっていたとは知らなかった。ftpみたいだ。ssh はこの辺(STDERRの扱い)も一本のTCPセッションで面倒見れるように作ってあるんだな。