web-dev-qa-db-ja.com

プロトコルバージョンの不一致-シェルはクリーンですか?

ここに記載されているrsyncバックアップを実行するための指示に従う場合: http://troy.jdmz.net/rsync/index.html

「プロトコルバージョンの不一致-シェルはクリーンですか?」というエラーが表示されます。

これに対処するために、プロンプト(PS1 = "")とmotd(.hushlogin)の表示を消音する必要がある場所を読みました。これを実行したら、プロンプトとログインバナー(MOTD)は表示されなくなりますが、実行するとエラーが表示されます。

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/

Sshクライアントとsshdサーバーの両方がプロトコルのバージョン2を使用しています。

何が問題でしょうか?ありがとう。

[編集]私は http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html を見つけました。これは、「 -2 sshまたはsloginのフラグ

 ssh -2 -i ~/.ssh/my_private_key remotemachine"

エラーが変更された後、私はこの変更を入れたと思うので、これが問題を解決したかどうかは不明ですが、実際にはエラーが別の何かに進化しました。詳細がわかり次第、更新します。そして、私はこれをemacsシェルで実行する提案を確かに試みます-ありがとう。

62
rfreytag

ログインスクリプト(.bashrc/.cshrc/etc。)の1つが、ターミナルにデータを出力している可能性があります(そうでない場合)。これにより、sshが接続し、予期しない余分なデータの受信を開始するため、コピーの準備ができたときにエラーが発生します。起動スクリプトで生成された出力を削除します。

Bashrcで次のコードを使用すると、端末がインタラクティブでテキストのみを出力するかどうかを確認できます。他のシェルにも同等のものが存在します。

if shopt -q login_Shell; then
    [any code that outputs text here]
fi

または、次のように、シェルがインタラクティブな場合、特別なパラメータ-にはiが含まれるため、

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

詳細については、以下を参照してください。 LinuxからWindowsへのsshを介したrsync sbs 2003プロトコルの不一致

これを診断するには、ホストにSSHでログインしたときに次の出力が得られることを確認してください。

USER@HOSTNAME's password: 
Last login: Mon Nov  7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$ 

改行やその他のデータを取得すると、追加の出力が送信されていることがわかります。 .bashrc/.cshrc/.profile/etcの名前を変更できます。ファイルを別のファイルに変換して、余分な出力を出力しないようにします。もちろん、これを引き起こす可能性のあるシステムファイルはまだあります。その場合は、システムファイルがデータを出力しないことをシステム管理者に確認してください。

66
Andrew Case

シェルがクリーンかどうかをssh接続用にテストする簡単な方法があります。対話型シェルを起動するのではなく、ssh接続からコマンドを実行します。 falseコマンドは出力を生成せずにすぐに終了するため、適切なテストです。

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash$

そのコマンドラインが出力を生成する場合、起動スクリプトの1つが原因です。

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
Welcome to RemoteHost!

This system is company property and is provided for authorized use only, 
as set forth in applicable written policies. Unauthorized use is prohibited 
and may be subject to discipline, civil suit and criminal prosecution.

Welcome back - You last logged in 16 days ago...
bash$

このエラーが発生しているかどうかを確認するもう1つのことは、rsyncがインストールされていて、sshで検索できるかどうかです。

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
bash$

Rsyncがパスにない場合は、代わりに次のように表示されます。

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash: rsync: command not found
bash$

これを修正するには、rsyncをインストールするか、インストールされているが通常とは異なる場所にある場合は、その場所をrsyncコマンドラインに渡します。

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \
    --rsync-path="/usr/local/bin/rsync" \
    remoteuser@remotehost:/remote/dir /this/dir/
21
Stobor

これは通常、非インタラクティブシェルでシェルのログイン情報が出力することにより発生します。これが当てはまるかどうかをテストするには、次のようにします。

ssh username@Host "/bin/true" > testfile
ls -l testfile

Testfileが0バイトでない場合、問題はシェルが何かを出力していることです。 /etc/profile.profile.bashrc.cshrcなどを確認します。そうである場合は、次のコマンドを使用して、端末がインタラクティブでテキストのみを出力するかどうかを確認するように変更できます。 bashrcのコード。他のシェルにも同等のものが存在します。

if shopt -q login_Shell; then
    [any code that outputs text here]
fi

または、次のように、シェルがインタラクティブな場合、特別なパラメータ-にはiが含まれるため、

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

ただし、テストファイルが実際に0バイトの場合、シェルは動作していますが、非常に古いバージョンのrsyncしか使用していない可能性があります。古いrysncサーバーのバージョンがそれを認識しないほど高いバージョンをアドバタイズしないようにクライアントエンド(新しいエンドであると想定)に伝えることができます。これは、--protocol=オプションを使用して行うことができます。私の場合、--protocol=30を使用することでうまくいきました。

それでも問題が解決しない場合は、rsysncが接続しているユーザーとしてsshを試し、rsync --versionを実行してシェルがrsyncを見つけられるかどうかを確認してください。コマンドが見つからないというメッセージが表示される場合は、rsyncが接続先のマシンにインストールされていないか、パスに含まれていない可能性があります。 Rsyncには、リモートエンドのパスを指定するオプションがあります。manページを参照してください。

7
Azendale

protocol version mismatch -- is your Shell clean?otherの終わりにまだrsyncをインストールしていないためです。 Sudo yum install rsync 問題を解決しました。

4
Kjetil S.

これは他の返信からの特別なケースですが、それからそれほど違いはありません。

Ssh経由でrsyncを実行するには、リモートrsyncコマンドを実行するためのsshでのシェルアクセスが必要です。 sshアカウントがscp/sftpのみを許可している場合は、rsyncの削除を開始できず、このエラーが発生して失敗します。

これは上記と同じコマンドでテストできます

ssh remotehost false

これは失敗し、これは成功するはずです

sftp remotehost

これは、sftpのみのアクセス権があることを証明しています。

必要な権限がある場合は、/etc/ssh/sshd_configを編集してmatchおよびforcecommandエントリを確認することで、そのユーザーのsftpのみのアクセスを無効にできます。

これもチェックできます post

4
higuita

コマンドを直接実行する場合、プロンプトはまったく表示されず、非対話的に表示されます。単純なgoogleが最初の結果を表示します: http://marc.info/?l=rsync&m=100263876212594&w=2 そして、シェルは潜在的に呼び出すことができるため、非インタラクティブモードでは何も表示しないでください。たとえば、既存のプロンプトに「bash」と入力すると、新しいプロンプトしか表示されません。

2
dgq8

これは、RSYNCが予期しない「パスワードが6日で期限切れになる」などのリモートホスト上のログインメッセージが原因である可能性があります。

1
Dief

rsync version 2.5.7 protocol version 26からversion 3.1.1へのインスタンスからファイルをプルするときにもこのエラーが発生します。

protocol version mismatch - is your Shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(62)
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1]

しかし、リモートシェルにはログインバナーがありませんでした。代わりに、解決策は古いプロトコルを指定することでした( ref ):

rsync --protocol=29 ...
0
patricktokeeffe