Rsync 似乎与 .bashrc 不兼容(导致“你的外壳干净吗?”)

Com*_*ist 23 bash rsync

事实证明 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]
Run Code Online (Sandbox Code Playgroud)

正如这里建议的那样删除服务器上的 .bashrc 解决了这个问题。如何在不删除 .bashrc 文件(临时)的情况下解决它?

Gre*_*ill 25

如果.bashrc远程服务器上的 向终端输出任何内容,您可能会遇到问题。Rsync 可能没有预料到,因此可能会出现问题。

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

  • 那么如果我只能修改客户端上的文件,如何将任何输出通过管道传输到 /dev/null ? (3认同)
  • 来自 rsync 手册页:“协议版本不匹配 - 你的 shell 干净吗?” 此消息通常是由于您的启动脚本或远程 shell 设施在 rsync 用于传输的流上产生不需要的垃圾而引起的。诊断此问题的方法是运行远程 shell,如下所示: ssh remotehost /bin/true > out.dat 然后查看 out.dat 文件。如果一切正常,则 out.dat 应该是零长度文件。 (2认同)

Ran*_*all 11

.bashrc 确实不是生成输出的正确位置,因为它会导致此类问题。但是,很多人都侥幸成功,直到他们尝试运行 rsync :-)

任何需要的输出(以及相关的逻辑和命令)都应该移动到您的 .bash_profile(请参阅服务器故障问题“.profile vs. .bash_profile vs. .bashrc”以进一步讨论文件之间的差异)。

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


小智 7

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

我的 $user/.bashrc 文件总是以以下部分开头,以防止出现此类问题。我将它复制到 root 的 .bashrc 和 rsync'ing 现在就像一个魅力!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Run Code Online (Sandbox Code Playgroud)

HTH, 卡斯滕


nde*_*mou 5

问题

由于复杂的原因, rsync/scp/sftp 在连接到另一台主机时运行 .bashrc。.bashrc 的存在不是问题。如果 .bashrc 中的任何命令在交互式会话中产生输出,就会出现问题。

大多数情况下的好解决方案

将这些命令中的任何一个放在 .bashrc顶部

任何一个

[[ $- != *i* ]] && return
Run Code Online (Sandbox Code Playgroud)

或者

[ -z "$PS1" ] && return
Run Code Online (Sandbox Code Playgroud)

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

罕见情况的好解决方案

如果您想对让 bashrc 命令即使在非交互式会话中运行也更加偏执,您至少应该包装可能产生输出的命令,如下例(参考):

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...commands that may produce output goes here...
fi
Run Code Online (Sandbox Code Playgroud)

您可能应该避免的解决方案

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