事实证明 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来解决此问题。
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, 卡斯滕
问题
由于复杂的原因, 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 中,但我怀疑这是否总是好的(原因在这里解释)
| 归档时间: |
|
| 查看次数: |
35519 次 |
| 最近记录: |