协议版本不匹配 – 你的shell是干净的吗?

当按照说明做rsync备份在这里给出: http : //troy.jdmz.net/rsync/index.html

我得到错误“协议版本不匹配 – 你的shell是干净的吗?

我读了一些我需要沉默的提示(PS1 =“”)和motd(.hushlogin)显示来处理这个问题。 我这样做了,提示和login横幅(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指示有时需要“强制V2使用-2标志ssh或slogin

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

目前还不清楚这是否解决了这个问题,因为我认为在错误发生变化之后把这个变化放在了错误之后,但是事实上错误已经演变到另外一个东西了。 当我了解更多时,我会更新这个。 我一定会尝试在emacs shell中运行这个build议 – 谢谢。

    其中一个login脚本(.bashrc / .cshrc /等)可能会将数据输出到terminal(不应该是)。 这导致ssh错误,当它连接并准备好复制,因为它开始接收额外的数据,它不期望。 删除在启动脚本中生成的输出。

    您可以检查您的terminal是否是交互式的,只能通过在bashrc中使用以下代码输出文本。 其他shell也有相同的东西:

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

    或者像这样,因为特殊的参数-包含i当shell是交互式的:

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

    欲了解更多信息,请参阅: rsync通过SSH从Linux到Windows SBS 2003协议不匹配

    要诊断这一点,请确保以下是您input主机时的输出:

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

    如果你得到任何换行符或其他数据,你知道额外的输出正在发送。 你可以重命名你的.bashrc / .cshrc / .profile / etc。 文件到别的东西,所以他们不会输出额外的输出。 当然,还有系统文件可能导致这种情况。 在这种情况下,请检查您的系统pipe理员,系统文件不输出数据。

    有一个简单的方法来testing你的shell是否干净,用于ssh连接:从ssh连接运行一个命令,而不是启动一个交互式shell。 false命令会立即终止而不会产生任何输出,所以这是一个很好的testing:

     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$ 

    另一件要检查你是否得到这个错误的事情是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不在path中,您将看到如下所示的内容:

     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/ 

    这通常是由你的shell的login东西在非交互式shell上输出东西引起的。 你可以通过下面的方法来testing这种情况:

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

    如果testfile不是0字节,那么麻烦的是你的shell正在输出一些东西。 检查/etc/profile.profile.bashrc.cshrc等。如果是这样,你可以改变它来检查你的terminal是否是交互式的,只能通过在bashrc中使用下面的代码来输出文本。 其他shell也有相同的东西:

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

    或者像这样,因为特殊的参数-包含i当shell是交互式的:

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

    但是,如果testing文件实际上是0字节,那么您的shell正在运行,但是您可能只有一个非常旧的rsync版本。 你可以告诉客户端(假设它是新的结束),不宣传如此高的版本,旧的rysnc服务器版本不能识别它。 您可以使用--protocol=选项来执行此操作。 在我的情况下,使用 – 协议--protocol=30做的伎俩。

    如果仍有问题,请尝试用户rsysnc正在连接并尝试运行rsync --version以查看shell是否可以findrsync。 如果你得到的东西说没有find命令,那么rsync可能没有安装在你连接的机器上,或者它可能不在path中。 Rsync有指定远程path的选项,请阅读手册页。

    这是其他答复的一个特例,但与以前没有什么不同。

    要通过ssh执行rsync,需要在ssh中使用shell来执行远程rsync命令。 如果您的ssh帐户只允许scp / sftp,您将无法启动删除rsync并失败给出此错误。

    这可以用与上面相同的命令来testing

     ssh remotehost false 

    这一个应该失败,这个应该是成功的

     sftp remotehost 

    这certificate你只有一个sftp访问权限。

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

    你也可以查看这个post

    直接执行命令时不会显示提示符,非交互式显示。 一个简单的谷歌出现了第一个结果: http : //marc.info/?l=rsync & m=100263876212594 & w=2而且,因为shell可能被调用,它不能以非交互模式显示任何东西 – 就像在input“ bash“转换成现有的提示符,只是出现新的提示符。

    我的protocol version mismatch -- is your shell clean? 只是因为我还没有在另一端安装rsync。 sudo yum install rsync解决了这个问题。

    这可能是由远程主机上的login消息引起的,比如“您的密码将在6天内过期”,RSYNC不期望