Rsync似乎与.bashrc不兼容(原因是“你的shell干净吗?”)

事实certificate,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文件(暂时)?

如果远程服务器上的.bashrc将任何内容输出到terminal,则可能会遇到问题。 Rsync可能不会期望,并可能有问题的结果。

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

.bashrc实际上不是产生输出的正确位置,因为它会导致这种问题。 尽pipe如此,许多人逃避了,直到他们尝试运行rsync 🙂

任何需要的输出(以及相关的逻辑和命令)应该被移动到你的.bash_profile文件中(参见例如服务器故障问题“.profile与.bash_profile与.bashrc”以获得关于文件之间差异的进一步讨论)。

这样,当你login的时候,你不需要牺牲获取输出,也不需要在你想使用rsync的时候对你的.bashrc做临时修改。

我一直在我的用户帐户上有.bashrc文件,从来没有这个问题,直到我今天尝试rsync东西到我的服务器使用root帐户。 你的文章帮我find了解决办法:

我的$ user / .bashrc文件总是从以下部分开始,以防止这种问题。 我复制到根的.bashrc和rsync'ing现在就像一个魅力!

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

HTH,卡斯滕

由于复杂的原因, rsync / scp / sftp在连接到另一台主机时运行.bashrc。 你必须在你的.bashrc顶部有这些命令:

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

要么

 [ -z "$PS1" ] && return 

以上任何命令都只允许执行交互式会话的其余部分.bashrc命令。 据我所知,你不需要他们的任何其他types的会议(事实上,我已经看到在Arch和Debian使用这种技术在他们的bashrc默认的bashrc)。

但是,如果你想让你的bashrc命令在非交互式会话中运行,那么你至less应该包装你的bashrc的命令,这些命令产生像这样的输出( 参考 ),以便它们只能在交互式会话中运行:

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

请注意,其他人build议将输出文本的命令移动到您的bash_profile中,但是我怀疑这是否总是好(因为这里解释的原因 )

 Pseudo-terminal will not be allocated because stdin is not a terminal. ssh: Could not resolve hostname tty: Name or service not known rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.1] 

我花了很多时间,直到我发现这个“-t tty”帮助了我。

 rsync -e "ssh -t tty -i key.pem" ...