プロトコルバージョンの不一致—シェルはきれいですか?


55

http://troy.jdmz.net/rsync/index.htmlにある指示に従ってrsyncバックアップを実行する場合

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

これに対処するために、プロンプト(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 を見つけましたこれは、「sshまたはsloginに-2フラグを使用してv2を強制する」ことが必要な場合があることを示しています

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

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


1
ログインスクリプトは、ウィンドウタイトル変更コマンドなど、すぐには表示されないものを出力しますか?これを確認する1つの方法は、Emacsを実行し、type ESC x shell、およびdoすることですexport TERM=xterm; ssh remotehost ls。制御文字またはその他の偽の出力が表示された場合、それを見つける必要があります。
ジル 'SO-悪であるのをやめる'

1
私は同じ問題を抱えていました。私の場合、SSHサーバーはユーザーをchrootし、SFTPアクセスのみを許可するように構成されていたため、リモートシェルからrsyncコマンドを実行することはできませんでした。サーバーにアクセスできる場合は、/ etc / ssh / sshd_configのForceCommand構成オプションを確認してください。それが問題である何かに設定されている場合。
デビウス

記録のために、プロトコルの不一致をあきらめたばかりの状況に陥りました。rsync --version両方のホストで同一の出力、対話型および非対話型のsshは完全にサイレントで、authorized_keysに派手なものはありません...ただ機能しません。私はこのコメントを、ラビビトの穴埋めをしている他の人に残します。あなた自身を支持し、--rsync-pathなしで試してください。あなたの問題はおそらくこのSOとは何の関係もないことに気付くでしょう。
シェルドン

@sheldonh:あなたの場合、ローカルマシンとリモートマシンのパスは異なりましたか?私の場合、とにかくそれらは同じであり、それを与えても与えなくても(--rsync-path)は私にとっては変わりません。
0xC0000022L

1
@ 0xC0000022L申し訳ありませんが、思い出せません。
シェルドン

回答:


62

ログインスクリプトの1つ(.bashrc / .cshrc / etc。)は、おそらく端末にデータを出力しています(本来あるべきではない場合)。これにより、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の名前を変更できます。ファイルを別のファイルに追加して、余分な出力が出力されないようにします。もちろん、これを引き起こす可能性のあるシステムファイルはまだあります。その場合、システムファイルがデータを出力しないことをシステム管理者に確認してください。


5
echo~/.bashrc、Thxを。あなたは私の一日を作った
-user9869932

19

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コマンドラインに渡します。

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

7

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

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を検出できるかどうかを確認してください。command not foundというメッセージが表示された場合、rsyncが接続先のマシンにインストールされていないか、パスにない可能性があります。Rsyncには、リモートエンドのパスを指定するためのオプションがあり、マニュアルページを読んでください。


--protocol2.5.6サーバー(プロトコルバージョン26)と3.1.0クライアント(プロトコルバージョン31)で私の問題を解決したヒントについて+1
MattBianco

4

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

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

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

ssh remotehost false

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

sftp remotehost

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

必要に応じてアクセス許可がある/etc/ssh/sshd_config場合はmatchforcecommandエントリを編集して確認し、エントリを編集することにより、そのユーザーのsftpのみのアクセスを無効にすることができます。

この投稿を確認することもできます


4

私はprotocol version mismatch -- is your shell clean?もう一方の端にrsyncをまだインストールしていないという理由だけで得ました。sudo yum install rsync問題を解決しました。


コンテナをいじって30分過ごし、Ansibleはrsyncが機能していなかった理由を疑問に思っていました。ありがとう;)
ライアン・フィッシャー

2

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


おそらく十分に明確にしなかったかもしれませんが、すでにこの「プロンプト(PS1 = "")およびmotd(.hushlogin)」を実行しています。実際、ログインはプロンプトを表示しません。これにもかかわらず、プロトコルの不一致エラーが表示されます。ありがとうございます-提案に感謝します。
-rfreytag

基本的にこれについては既に述べましたが、.bashrc(または他のプロファイルスクリプト)に何かが画面にエコーされる場合、このような問題が発生しました。特定の方法で物事を変更するシェルで特定のプログラムを実行すると、この種の問題さえ発生しました(たとえば、chshでシェルを変更できなかったため、.cshrcを実行してbashを変更し、シェル、およびsshはもう機能しません)。
lsd

それは確かに面白いです。rsyncコマンドを対話的に実行すると画面にエコーが表示されず、ログインが完全にサイレントになるため、これをどのように診断できるのでしょうか?うーん...あなたが提案するように、シェルに何か問題があるのだろうか。ありがとう。
-rfreytag

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.