协议版本不匹配-您的外壳干净吗?


55

按照此处给出的指示执行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标志强制s v2进行ssh或slogin

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

目前尚不清楚这是否解决了问题,因为我认为在错误更改后我将这一更改放进去了,但事实是错误已演变为其他错误。了解更多信息后,我将对其进行更新。我当然会尝试在emacs shell中运行此建议-谢谢。


1
您的登录脚本是否输出不立即可见的内容,例如,更改窗口标题的命令?一种检查方法是运行Emacs,然后输入type ESC x shell和do export TERM=xterm; ssh remotehost ls。如果出现任何控制字符或其他虚假输出,这就是您必须寻找的内容。
吉尔(Gilles)'所以

1
我遇到了同样的问题。在我的情况下,SSH服务器配置为chroot用户,并且仅允许SFTP访问,因此无法从远程Shell运行rsync命令。如果您有权访问服务器,请检查/ etc / ssh / sshd_config中的ForceCommand配置选项。如果设置为某些问题。
devius 2012年

作为记录,我遇到了一种情况,我只是放弃了协议不匹配的情况。rsync --version在两个主机上的输出相同,交互式和非交互式ssh完全静音,authorized_keys中没有任何花哨的内容……只是不起作用。我把这个评论留给其他那些正在讨价还价的人。帮个忙,不要使用--rsync-path。您可能会发现您的问题与此SO无关。
sheldonh

@sheldonh:您的情况下本地计算机和远程计算机上的路径是否不同?就我而言,它们是相同的,给予或不给予(--rsync-path)对我来说并不会改变任何事情。
0xC0000022L 2016年

1
@ 0xC0000022L对不起,我不记得了。
sheldonh

Answers:


62

您的登录脚本之一(.bashrc / .cshrc / etc。)可能正在将数据输出到终端(不应该这样)。这会导致ssh在连接并准备开始复制时出错,因为它开始接收意外的额外数据。删除启动脚本中生成的输出。

您可以通过在bashrc中使用以下代码来检查终端是否是交互式的,并且仅输出文本。其他shell也存在等效的东西:

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

有关更多信息,请参见:通过ssh从linux rsync到Windows 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 2016年

19

对于ssh连接,有一种简单的方法可以测试您的shell是否干净:从ssh连接运行命令,而不是启动交互式shell。该false命令将立即终止而不产生任何输出,因此是一个很好的测试:

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

如果该命令行产生任何输出,则应怪罪您的启动脚本之一:

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$

检查是否收到此错误的另一件事是ssh是否安装了rsync并可以找到它:

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/

7

这通常是由您的Shell的登录内容在非交互式Shell上输出内容引起的。您可以通过以下方法测试是否是这种情况:

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

如果testfile不是0字节,那么麻烦是您的shell正在输出某些内容。检查/etc/profile.profile.bashrc.cshrc,等。如果是这样,你可以改变它来检查,如果你的终端是通过在.bashrc中下面的代码交互,只输出文本。其他shell也存在等效的东西:

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字节,则说明您的shell处于运行状态,但是您可能只拥有非常旧的rsync版本。您可以告诉客户端(假设它是较新的一端)不要发布如此高的版本,以致旧的rysnc服务器版本无法识别它。您可以使用--protocol=选项进行操作。就我而言,使用--protocol=30就可以了。

如果仍然遇到问题,请在与rsysnc用户连接时尝试使用ssh,然后尝试运行rsync --version以查看shell是否可以找到rsync。如果收到表示未找到命令的内容,则rsync可能未安装在您要连接的计算机上,或者可能不在路径中。Rsync确实具有用于指定远程路径的选项,请阅读手册页。


+1提示有关--protocol使用2.5.6服务器(协议版本26)和3.1.0客户端(协议版本31)解决了我的问题的消息
MattBianco

4

这是与其他答复相比的特例,但与那时没有太大不同。

要通过ssh执行rsync,您需要ssh中的shell访问权限才能执行远程rsync命令。如果您的ssh帐户仅允许使用scp / sftp,则将无法启动remove rsync,并且无法给出此错误。

可以使用与上面相同的命令进行测试

ssh remotehost false

这个应该失败,这个应该成功

sftp remotehost

这证明您只有sftp访问。

如果您想要并拥有这样做的权限,则可以通过编辑/etc/ssh/sshd_config和检查matchforcecommand条目来禁用该用户的sftp only访问。

您也可以查看此帖子


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而且由于可以潜在地调用Shell,因此它不能以非交互模式显示任何内容,例如,仅键入“ bash”添加到现有提示中,则应该没有新提示出现。


也许我没有足够清楚,但是我已经完成了“提示(PS1 =“”)和motd(.hushlogin)”的操作。该登录确实不显示任何提示。尽管如此,协议不匹配错误仍然出现。不过谢谢-非常感谢这个建议。
rfreytag 2011年

您基本上已经提到了这一点,但是如果.bashrc(或其他配置文件脚本)中的任何内容回显到屏幕上,则我会遇到类似的问题。在shell中运行某些以某种方式更改内容的程序时,我什至遇到了这类问题(例如,我无法使用chsh更改shell,所以我让.cshrc运行bash来更改我的外壳程序和ssh不再起作用)。
lsd

好吧,这当然很有趣。我想知道如何诊断此问题,因为以交互方式执行rsync命令不会在屏幕上显示任何回声,并且登录完全是静默的?嗯...我想知道您的建议是否对外壳有影响。谢谢。
rfreytag

1

这可能是由于远程主机上的登录消息(例如“您的密码将在6天后到期”)引起的,RSYNC不会

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.