通过 SSH 强制 Rsync 守护进程

Tim*_*dit 2 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Too*_*Tea 5

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

这里的其他答案部分错误,部分没有抓住重点。您所做的是通过 SSH 连接生成 rsync 守护进程并与之通信的正确记录方法。对于那些不熟悉此模式的人,我建议您查看 rsync 手册中名为“通过远程外壳连接使用 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进程通信。