通过 SSH 强制 Rsync 守护进程

通过 SSH 强制 Rsync 守护进程

感谢 @roaima 的敏锐洞察力,我注意到下面的远程服务器备份脚本实际上并没有像我希望的那样使用 SSH 加密。

我的 rsync 命令基于此处找到的示例:
https://www.man7.org/linux/man-pages/man1/rsync.1.html

rsync -av -e "ssh -l ssh-user" rsync-user@host::module /dest

然而,当我当前的备份脚本执行时实际发生的是:

1.) 它作为指定用户连接到 ssh,然后
2.) 我的登录通知脚本通过电子邮件确认 ssh 用户的登录(在断开连接/重新连接时重复),
3.)问题:rsync 守护进程连接并执行其业务-外部-ssh shell,这意味着我实际上没有获得我想要的 ssh shell 加密。

我通过执行备份脚本然后在远程服务器上执行命令来验证这一点who,这确认了ssh-backup-user-不是-在 rsync 守护进程执行时连接到服务器。

我当前的备份脚本(必须以非 root 用户身份执行)

#!/bin/bash
while [ 1 ]
do
     rsync -avxP --delete --append --checksum --timeout=180 --bwlimit=150 --rsync-path="sudo rsync" --log-file=/var/log/rsync.log --password-file=/etc/rsyncd.passwd -e "ssh -l backup-user" 111.22.333.444::data /media/user/WebMade/Server-Backups/Prod/today/
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 10
    fi
done
#EOF

也许有人能够澄清发生了什么,要么是我误解了手册页(很可能是 :-/ ),要么是提供的示例是错误的。

谢谢

答案1

一切都很好,这里没有问题。

这里的其他答案部分错误,部分没有抓住要点。您所做的是通过 SSH 连接生成 rsync 守护进程并与之通信的正确记录方法。对于那些不熟悉这种模式的人,我建议您查看 rsync 手册中名为“通过远程 shell 连接使用 RSYNC-Daemon 功能”。

设置--rshor -etossh与双冒号::语法组合可启用此模式。然后,Rsync 将使用 ssh 连接到远程计算机,在那里生成一个守护进程(在 SSH 会话下)并通过 SSH 隧道与其进行通信。这是一种非常有用的模式,因为它允许您将仅守护程序功能与 SSH 身份验证和加密一起使用。

who并没有告诉你你认为它会做什么。who(就像w和其他替代方案一样)仅列出交互式会话,ssh用于启动 rsync 守护进程的会话不是交互式的(甚至根本不使用 shell),因此它不会出现在这里。如果您不只是信任 rsync 执行手册中所述的操作,您可以使用ps -efH查看 ssh 会话和远程计算机上运行的 rsync 守护进程,ss -t以查看除了端口上的 SSH 之外,计算机之间是否没有 TCP 连接22、或者strace在rsync进程上查看rsync进程与ssh进程通信。

答案2

::目标路径源中存在双冒号 ( ) 表示使用该rsyncd服务。单个冒号 ( :) 表示(通常)通过 登录ssh

完成此操作后,远程路径必须以/帐户将登录的主目录开头或相对于该主目录。

例如

[email protected]:docroot

取下--checksumrsync决定何时使用。 (它自动跳过校验和的唯一一次是当文件大小和修改时间双方都匹配时。)

停止使用任何变体,--append否则您将要迟早会导致备份中的数据损坏。您几乎肯定会想要--partial这里,并且它已经包含在-P.

用于ssh登录backup-user远程系统203.0.113.1有(比如说)两个目录logswebsite,然后您可以使用如下命令行进行备份:

 rsync -aivP --delete [email protected]:website/ /my/local/copy

我现在明白了一条评论您需要从rsyncd服务复制文件,但希望通过ssh提供安全(加密)传输的连接传输它们。方便的是,手册页rsync实际上有一个示例:您设置环境变量RSYNC_CONNECT_PROG来定义ssh隧道,然后rsyncd在命令本身中连接到服务:

RSYNC_CONNECT_PROG='ssh [email protected] nc %H 873' rsync -aivP --delete localhost::data/ /my/local/copy

不过要小心。这两种解决方案都无法为您提供长期保护,防止网页被木马劫持等损坏。每次您都将备份替换为完整的实时副本,因此一旦您运行备份脚本,实时错误就会传播到您的备份。考虑政府财政司司长或其他一些多级备份计划(三个不同的备份,周日、周二、周四各一个)。诸如此类的工具rsnapshot可以作为上面的层有效地实现这一点rsync

相关内容