Rsync over ssh,每次都很好用。
但是,尝试 rsync 到仅允许 sftp 登录但不允许 ssh 登录的主机时,会出现以下错误:
rsync -av /source ssh user@remotehost:/target/
协议版本不匹配——你的外壳干净吗?(有关解释,请参阅 rsync 手册页)rsync 错误:compat.c(171) [sender=3.0.6] 处的协议不兼容(代码 2)
这是 rsync 手册页中的相关部分:
此消息通常是由您的启动脚本或远程 shell 工具在 rsync 用于其传输的流上产生不需要的垃圾引起的。诊断此问题的方法是像这样运行远程 shell:
Run Code Online (Sandbox Code Playgroud)ssh remotehost /bin/true > out.dat然后看看out.dat。如果一切正常,那么 out.dat 应该是一个零长度文件。如果您从 rsync 收到上述错误,那么您可能会发现 out.dat 包含一些文本或数据。查看内容并尝试找出产生它的原因。最com?原因是错误配置的 shell 启动脚本(例如 .cshrc 或 .profile)包含非交互式登录的输出语句。
在我的系统上尝试这个在 out.dat 中产生了以下内容:
ssh-dummy-shell:不允许的命令。
正如我所想,主机不允许 ssh 登录。
以下链接显示可以使用带有 sshfs 的保险丝来完成此任务 - 但是它非常慢,并且不适合生产使用。
有没有机会让 rsync sftp 工作?
Dav*_*ett 41
不幸的是不是直接的。rsync需要一个带有外壳的干净链接,以允许它rsync在以这种方式运行时启动 的远程副本。
如果您有某种在主机上运行长期监听进程的方法,您可以尝试手动启动 rsync 监听非特权端口上的连接,但大多数这样做的技术也需要通过 SSH 进行适当的 shell 访问,并且它依赖于主机防火墙安排允许在您选择的端口上进行连接(以及首先安装了 rsync 的主机)。但是,通常不建议将 rsync 作为可公开寻址的服务(而不是通过 SSH 或类似方式间接使用)用于非公开数据。
如果您的主机允许使用 PHP 或类似的脚本编写脚本,并且没有将其锁定,因此exec用户脚本无法编辑额外的进程,那么您可以尝试以这种方式在侦听模式下启动 rsync。如果您的一端是可连接的(您正在运行可访问外部世界的 SSH),您可以反向尝试此操作 - 在服务器上运行一个脚本 rsync 但不是侦听传入连接,而是让它联系您的本地服务并以这种方式同步。这仍然依赖于实际安装在主机上的 rsync,这不是给定的,或者您可以上传工作副本,但不具有以可公开寻址的方式运行 rsync 守护程序并通过未加密的方式与其交谈的安全隐患渠道。
如上所述的乱搞可能违反主机政策,即使它完全有效,并且可能会让你被踢。您最好询问是否可以为该帐户启用完整的 shell,并且要么放弃该主机的 rsync,要么放弃该主机并移至其他地方(如果他们不这样做)。
xio*_*xox 24
使用 rsync 的替代方法是使用 lftp(可以连接到 sftp)并使用 mirror 命令。例如一个可以做
lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
Run Code Online (Sandbox Code Playgroud)
Kam*_*iel 22
理论上,是的。您可以使用 FUSE在本地机器上挂载远程文件系统。然后您可以在挂载目录和本地目录之间运行 rsync 的本地副本。我没有亲自尝试过这个,但理论上应该可行。通过 SSH 执行 rsync 的效率可能要低得多,因为它需要至少传输每个文件的一部分来执行比较。
omi*_*nug 14
rclone支持从/向 SFTP 网络共享同步以及挂载 SFTP 网络共享,而不是 Rsync 。
rclone config并按照步骤添加新的远程端点配置。sftp在协议后端选择处输入。rclone sync local_path remote:remote_path(文档)。这可能会导致数据丢失。IMO, rclone 提供了比LFTP更加自动化友好的 CLI 。
我知道这并不能回答最初的问题,但可能是来到这里的一些人的需求。
小智 6
有点晚了,但这是我使用 sshfs 的方法
source /scratch/slimdata/password.sh
mkdir tmp_mnt
echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
rsync -rutL --delete tmp_mnt/ to_sync/
fusermount -u tmp_mnt
rmdir tmp_mnt
Run Code Online (Sandbox Code Playgroud)
它似乎具有以下其他答案所没有的优点:
rsync守护进程我还没有测试过它,但我已经成功地使用了所有这些功能,除了rrsync.
ssh-keygen(openSSH 功能)在本地创建密钥~/.ssh/authorized_keys(openSSH 功能)中有一个条目~/.ssh/authorized_keys(openSSH 功能)使用rrsyncrsync 分发的脚本作为命令,例如command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-然后你可以正常从客户端rsync。
该页面末尾的命令可以缩短。在~/.ssh/config创建这样的节:
Host remote # can be host or ip or custom-label
User user # login on remote host
HostName optional-dns-resolvable-host-or-ip # if label used above
IdentityFile ~/.ssh/id_remote_backup
然后是来自客户端的 rsync 命令
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/
Run Code Online (Sandbox Code Playgroud)
变成
rsync -av user@remote: etc2/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116308 次 |
| 最近记录: |