web-dev-qa-db-ja.com

「プロトコルバージョンの不一致—シェルはクリーンですか?」シェルIS cleanの場合のrsyncエラー

サーバーでSSHを介してデーモンモードで実行されているrsyncでrsyncを使用してファイルをダウンロードしようとすると、クライアントで次のエラーが発生します。

rsync -a myserver:/remote/path/ localdestdir/
protocol version mismatch -- is your Shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]

サーバーは、ユーザーの.ssh/authorized_keysにこれを持っています:

command="rsync --config=/path/to/engine-rsyncd.conf --server --daemon ." ssh-rsa ...

私はこの問題について私が見つけることができるすべてを読み、みんなが示唆するように、シェルがきれいでIT IS CLEAN

ssh myserver false >out.tmp

長さがゼロのファイルout.tmpを作成します(サーバーのauthorized_keysから「command = ...」を削除した場合)。

ユーザーのシェルをサーバーのbashではなくrsshに設定することも試しました-同じことです。

クライアントとサーバーの両方がUbuntu 16.04を実行しているため、rsyncのバージョンは同じです(3.3.1、プロトコル31)。

他に何ができますか? rsyncとSSHで詳細ログを有効にしてみましたが、ログからは何の手がかりも得られません。 rsyncデーモンは何もログに記録しません

2018/02/12 15:14:24 [6215] connect from clienthostname
4
EM0

この場合の問題は、シェルがクリーンでないことではなく、クライアントrsyncがサーバーで実行する必要があるコマンドを実行できることです。 command="rsync..."をauthorized_keysで使用すると、クライアントから渡されたコマンドに関係なく、sshdが実行するコマンドになります。

クライアントrsyncは、次の引数を使用してsshを呼び出します。

 ssh myserver rsync --server --sender -de.LsfxC。 /remote/path/`.

サーバーがファイルを送信するようにするため、--senderはこれらのオプションの一部であることに注意してください。サーバーがファイルを受信する必要がある場合は存在しません。 --daemonがrsyncのオプションに存在しないことにも注意してください。オプション--config--daemonとのみ関連しているため、コマンドエントリから削除することもできます。

すでに述べたように、コマンドはauthorized_keysファイルの場合とまったく同じように実行されます。つまり、クライアントから渡された引数はすべて無視されます。したがって、authorized_keysでコマンドを本当に使用したい場合は、rsyncがsshクライアントに提供する正確なオプションを指定する必要があります。つまり、rsyncを使用して、authorized_keysで指定されたパスから正確にファイルを受信できます。クライアントのrsyncにさまざまなオプションを指定すると、それらはサーバーでは有効にならず、これらのオプションの効果がクライアントに実装されているか、rsyncのサーバー側に実装されているかによって、動作しない場合があります。したがって、本当にそれが必要かどうかを検討する必要があります。

編集スクリプトをコマンドとして使用し、SSH_ORIGINAL_COMMAND環境変数を調べて、必要に応じてrsyncを呼び出すことができます。リモートパスは最後の引数なので、正しいプレフィックスで始まり、親ディレクトリに移動する「/ ..」が含まれていないかどうかを確認したいだけかもしれません。

1
RalfFriedl