Rsync似乎与.bashrc不兼容(因为“您的外壳干净吗?”)


16

事实证明rsync无法与具有.bashrc文件的远程服务器一起使用?

在本地客户端上,当我运行rsync时:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

如此处建议的那样在服务器上删除.bashrc可解决此问题。如何解决而不删除.bashrc文件的问题?


1
检查是否为该帐户启用了ssh。
拉米

以下答案可能不正确。即使我的.bashrc文件没有任何更改,我最近在例行Ubuntu升级后也开始出现此错误。
塞林

否-如果删除.bashrc文件已将其修复(如本问题所述),则问题将从.bashrc输出。升级肯定会引入实际的协议不兼容性,这是完全不同的问题。
Randall

Answers:


21

如果.bashrc远程服务器上的向终端输出任何内容,您可能会遇到问题。Rsync可能不希望这样,因此可能会出现问题。

您可以通过删除.bashrc该输出文本中的任何命令,或将任何输出传递到/ dev / null 来解决此问题。


3
那么,如果我只能在客户端上修改文件,那么如何将任何输出传送到/ dev / null?
Computist 2011年

1
我想您可以作为系统管理员寻求帮助。您也许还可以通过其他方式修改服务器上的文件,例如FTP或scp。
Greg Hewgill

是的,我的.bashrc文件包含回显“ ***启动ROOT Shell ***”和回显“(请尽可能使用sudo而不是根shell!)”。消除这些回声可以解决问题。
Kentgrav

1
在rsync手册页中:“协议版本不匹配-您的外壳干净吗?” 此消息通常是由您的启动脚本或远程Shell工具在rsync用于其传输的流上产生不必要的垃圾引起的。诊断此问题的方法是像这样运行远程shell:ssh remotehost / bin / true> out.dat,然后查看out.dat文件。如果一切正常,则out.dat应该是零长度的文件。
Kentgrav '16

8

.bashrc实际上不是生成输出的正确位置,因为它会导致这种问题。但是,很多人都放弃了它,直到他们尝试运行rsync :-)

任何期望的输出(以及相关的逻辑和命令)都应移至您的.bash_profile(有关文件之间差异的进一步讨论,请参见服务器故障问题“ .profile与.bash_profile与.bashrc”)。

这样,您就不必在登录时就牺牲获取输出的权限,也不必在要使用rsync时处理对.bashrc的临时更改。


6

我的用户帐户上一直都有.bashrc文件,直到今天我尝试使用root帐户将某些内容同步到我的服务器时,再也没有这个问题。您的帖子帮助我找到了解决方案:

我的$ user / .bashrc文件始终以以下部分开头,以防止出现此类问题。我将其复制到root的.bashrc中,并且rsync'ing现在就像一个魅力一样起作用!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH,卡尔斯滕


这通常不适用于rsync,因为出于某种原因它被归类为“交互式外壳”。但是无论如何添加这是一条很好的路线,因为如果有任何输出,它可能会弄乱非交互式外壳。
Michael Schubert

我认为这是解决该问题的最佳方法。接受答案“在.bashrc中删除所有输出文本的命令”是不切实际的。
秦西

4

由于复杂的原因, rsync / scp / sftp在连接到另一台主机时运行.bashrc。您必须在.bashrc顶部具有以下任何命令:

要么

[[ $- != *i* ]] && return

要么

[ -z "$PS1" ] && return

以上任何命令仅允许执行交互式会话的其余.bashrc命令。据我所知,在其他任何类型的会话中都不需要它们(事实上,我已经从Arch和Debian中看到默认的bashrc在其bashrc中使用此技术)。

但是,如果您想让bashrc命令甚至在非交互式会话中运行也显得有些偏执,那么至少应该包装一下bashrc的命令,这些命令的确会产生这样的输出(参考),以便它们仅在交互式会话中运行:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

请注意,其他人建议将输出文本的命令移到您的bash_profile中,但我对此是否总是好事感到怀疑(出于此处说明原因

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.