はじめに
rsh.....、ずいぶん前にsshに取って代わられて、今となっては実運用で使うことは稀でしょう。
なおかつ「rloginは使えない状態で、rshだけ使えるようにする」なんて要件はまずないでしょう。
そんなレアケースに最近かかわり、若干ハマった箇所があったのでもろもろ共有します。
※引用しているドキュメントはAIXのものですが、コマンド仕様自体はRHELでも基本的に同じです
目次
1-rsh関連のサービスについて
rsh-server
、rsh
をインストールすると、以下のサービスが利用できるようになります。
この中で今回はrsh.socket
だけ有効化して、他は無効されている状態にします。
- rsh.socket
rsh (リモートシェル) は、ユーザーがリモートホスト上でシェルコマンドを実行するためのプロトコルです。
このサービスは、rsh コマンドによる接続要求を待ち受け、それに応じて新しいシェルセッションを開始します。
- rlogin.socket
rlogin は、リモートホストでのログインセッションを提供します。
rloginコマンドを使ってリモートホストに接続すると、ユーザーはそのホスト上で完全なログインシェルを開始できます。
rlogin.socket サービスは rlogin コマンドによる接続要求を待ち受け、それに応じて新しいログインセッションを開始します。
- rexec.socket
rexec (リモート実行) は、リモートホストで指定したコマンドを実行するためのプロトコルです。
このサービスは rexec コマンドによる接続要求を待ち受け、それに応じて指定されたコマンドの実行を開始します。
2-サーバー側の設定
rhel9ではrshが標準リポジトリに含まれていないため、epelからダウンロードします。
$ sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
$ sudo dnf -y update
$ sudo dnf -y upgrade
rsh-serverをインストールして、起動しておきます。
$ sudo dnf -y --enablerepo="epel" install rsh-server
$ sudo systemctl enable rsh.socket
$ sudo systemctl start rsh.socket
ホスト名関連の設定をします。
本来は/etc/hosts.equivではなく~/.rhostで設定したほうがいいのですが、
設定を簡略化するためhosts.equivで設定します。
$ sudo hostnamectl set-hostname <ホスト名>
例:hostnamectl set-hostname rsh-server
<クライアントのプライベートIP> <クライアントのホスト名>
例:10.0.0.11 rsh-client
<クライアントのホスト名> <OSユーザー名>
例:rsh-client ec2-user
3-クライアント側の設定
おなじくepelから、rshをインストールします。
$ sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
$ sudo dnf -y update
$ sudo dnf -y upgrade
$ sudo dnf -y --enablerepo="epel" install rsh
同じくホスト名関連の設定をします。
$ sudo hostnamectl set-hostname <ホスト名>
例:hostnamectl set-hostname rsh-client
<サーバのプライベートIP> <サーバのホスト名>
例:10.0.0.10 rsh-server
4-何故かrshでログインできない
この状態でクライアントからrshコマンドを実行すると、以下の状態になります。
結果だけ見ると、「コマンド実行は成功しているのに、ログインだけできていない...??」
という何とも不思議な状態になります。
$ rsh <サーバのホスト名>
例:rsh rsh-server
⇒応答が帰ってこない
$ rsh <サーバのホスト名> <コマンド>
例:rsh rsh-server ls -la
⇒正常に実行できる
5-結論
結論として、rshでログインできないのは正常な状態です。
なぜならrshは以下の仕様があるからです...。
-コマンド名が指定されている場合には、リモート・ホスト上で単一のコマンドを実行する。
-コマンド名が指定されていない場合は、rlogin コマンドを実行する。
つまりサーバー側でrlogin.socket
を起動していないので、rshでログインはできない、ということです。
この仕様が判明するまで私はしばらくハマってしまったため、
同じくハマっている人にこの情報が届けば幸いです。