rfr*_*tag 75 linux backup ssh rsync
按照此处给出的说明进行 rsync 备份时:http : //troy.jdmz.net/rsync/index.html
我收到错误消息“协议版本不匹配——你的外壳干净吗?”
我在某处读到我需要使提示 (PS1="") 和 motd (.hushlogin) 显示静音才能解决这个问题。我这样做了,提示和登录横幅(MOTD)不再出现,但运行时仍然出现错误:
rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/
Run Code Online (Sandbox Code Playgroud)
ssh 客户端和 sshd 服务器都使用协议的第 2 版。
可能是什么问题呢?
[编辑] 我发现http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html 指示有时需要“通过使用 -2 标志强制 v2 到 ssh 或 slogin
ssh -2 -i ~/.ssh/my_private_key remotemachine"
Run Code Online (Sandbox Code Playgroud)
目前尚不清楚这是否解决了问题,因为我认为我在错误更改后进行了此更改,但事实是错误已演变为其他内容。当我了解更多信息时,我会更新这个。我当然会尝试在 emacs shell 中运行它的建议 -
And*_*ase 81
您的登录脚本之一 (.bashrc/.cshrc/etc.) 可能正在向终端输出数据(不应该如此)。这会导致 ssh 在连接并准备复制时出错,因为它开始接收意外的额外数据。删除在启动脚本中生成的输出。
您可以通过在 bashrc 中使用以下代码来检查您的终端是否是交互式的并且仅输出文本。其他外壳也存在等效的东西:
if shopt -q login_shell; then
[any code that outputs text here]
fi
Run Code Online (Sandbox Code Playgroud)
或者,像这样,因为特殊参数-
包含i
shell 是交互式的:
if echo "$-" | grep i > /dev/null; then
[any code that outputs text here]
fi
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅:rsync via ssh from linux to windows sbs 2003 protocol mismatch
要对此进行诊断,请确保以下是您通过 ssh 连接到主机时获得的输出:
USER@HOSTNAME's password:
Last login: Mon Nov 7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$
Run Code Online (Sandbox Code Playgroud)
如果您获得任何换行符或其他数据,您就知道正在发送额外的输出。你可以重命名你的 .bashrc/.cshrc/.profile/etc。文件到别的东西,这样他们就不会输出额外的输出。当然,仍有可能导致这种情况的系统文件。在这种情况下,请与您的系统管理员确认系统文件不输出数据。
Sto*_*bor 24
对于 ssh 连接,有一种简单的方法可以测试您的 shell 是否干净:从 ssh 连接运行命令,而不是启动交互式 shell。该false
命令将立即终止而不产生任何输出,因此这是一个很好的测试:
bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key':
bash$
Run Code Online (Sandbox Code Playgroud)
如果该命令行产生任何输出,则应归咎于您的启动脚本之一:
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$
Run Code Online (Sandbox Code Playgroud)
检查您是否收到此错误的另一件事是 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$
Run Code Online (Sandbox Code Playgroud)
如果 rsync 不在路径中,您将看到如下内容:
bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key':
bash: rsync: command not found
bash$
Run Code Online (Sandbox Code Playgroud)
您可以通过安装 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/
Run Code Online (Sandbox Code Playgroud)
这通常是由于您的 shell 的登录内容在非交互式 shell 上输出内容造成的。您可以通过执行以下操作来测试是否是这种情况:
ssh username@host "/bin/true" > testfile
ls -l testfile
Run Code Online (Sandbox Code Playgroud)
如果 testfile 不是 0 字节,那么问题是你的 shell 正在输出一些东西。检查/etc/profile
, .profile
, .bashrc
, .cshrc
, 等。如果是,您可以更改它以检查您的终端是否是交互式的并且仅通过在 bashrc 中使用以下代码来输出文本。其他外壳也存在等效的东西:
if shopt -q login_shell; then
[any code that outputs text here]
fi
Run Code Online (Sandbox Code Playgroud)
或者,像这样,因为特殊参数-
包含i
shell 是交互式的:
if echo "$-" | grep i > /dev/null; then
[any code that outputs text here]
fi
Run Code Online (Sandbox Code Playgroud)
但是,如果测试文件实际上是 0 字节,那么您的 shell 正在运行,但您可能只有一个非常旧版本的 rsync。您可以告诉客户端(假设它是较新的一端)不要宣传如此高的版本,以至于旧的 rysnc 服务器版本无法识别它。您可以使用该--protocol=
选项执行此操作。就我而言,使用--protocol=30
就成功了。
如果您仍然遇到问题,请在用户 rsysnc 连接时尝试 ssh,然后尝试运行rsync --version
以查看 shell 是否可以找到 rsync。如果您收到一些提示未找到命令的信息,则 rsync 可能未安装在您要连接的机器上,或者它可能不在路径中。Rsync 确实有用于指定远程端路径的选项,请阅读手册页。
这是与其他回复相比的特例,但与当时并没有太大不同。
要通过 ssh 执行 rsync,您需要 ssh 中的 shell 访问权限来执行远程 rsync 命令。如果您的 ssh 帐户仅允许 scp/sftp,您将无法启动删除 rsync 并失败并给出此错误。
可以使用与上面相同的命令进行测试
ssh remotehost false
Run Code Online (Sandbox Code Playgroud)
这个应该失败,这个应该成功
sftp remotehost
Run Code Online (Sandbox Code Playgroud)
这证明您只有 sftp 访问权限。
如果您希望并且拥有这样做的权限,您可以通过编辑/etc/ssh/sshd_config
并检查match
和forcecommand
条目来禁用该用户的仅 sftp 访问权限。
你也可以看看这个帖子
小智 5
我得到的原因protocol version mismatch -- is your shell clean?
很简单,因为我还没有在另一端安装 rsync。sudo yum install rsync
解决了问题。
小智 2
直接执行命令时根本不会显示提示,而且是非交互式的。简单的谷歌显示第一个结果:http://marc.info/?l =rsync&m=100263876212594&w=2 \n并且由于 shell 可能被调用,因此它不能在非交互模式下显示任何内容 \xe2\x80\x94例如,当在现有提示中输入“bash”时,除了新提示之外什么都不会出现。
\n 归档时间: |
|
查看次数: |
81401 次 |
最近记录: |