我正在尝试使用 rsync 将某个文件夹从一台服务器(目标服务器)备份到另一台服务器(备份服务器)。我还需要从备份服务器调用 rsync,这样更容易在一个地方维护多台服务器的备份设置。
为了实现这一点,我尝试将 rsync 命令添加到备份服务器上的 crontab,以便我的文件定期同步。该命令如下所示:
rsync -av --delete target_server_user@target_server:/path/to/directory/ /path/to/directory
据我所知,rsync 默认使用 SSH 进行传输。当我手动运行命令时,它会要求输入密码remote_server_user
。虽然一次性手动同步没问题,但显然不允许使用 cron 进行定期计划同步。
因此,我使用 ssh-keygen 在备份服务器上创建了身份验证密钥对,并使用 ssh-copy-id 将创建的身份添加到目标服务器。但是当我尝试调用 rsync 时,它会要求输入密码。然后我发现我需要将身份添加到 ssh-agent。然后我发现 ssh-agent 甚至没有在备份服务器上运行,使用这个答案。
然后我用 启动它eval `ssh-agent -s`
,用 添加身份ssh-add path/to/identity
,检查身份是否已添加,ssh-add -L
并成功手动运行上述 rsync 命令。
但是,在关闭与备份服务器的 ssh 连接并以同一用户身份再次连接后,我发现 ssh-agent 未运行。当我启动它时,我没有在 的输出中看到任何添加的身份ssh-add -L
。因此 rsync 命令要求输入密码。
这是 ubuntu 服务器的一个功能吗(我从来没有在我的 ubuntu 桌面上手动启动 ssh-agent)?
当我修复 ssh-agent 并将上面的 rsync 命令添加到 crontab 时,它是否能够使用add-ssh
命令中添加的身份?如果 ssh-agent 和添加的身份仅适用于登录用户,则似乎我走错了方向。
或者也许有更好的方法来设置目录的定期计划同步?
我尝试在守护进程模式下设置 rsync,并创建所有这些rsyncd.conf
、机密等。但在成功手动运行该简单的 rsync 命令后,感觉它无需大量配置就可以完成我需要的工作。除了不起作用的 ssh 授权。
答案1
人们通常使用的一种解决方法是创建一个不使用密码保护的特定服务 ssh 密钥对。
为了远程服务器的安全,您可以使用额外的选项在~/.authorized_keys
文件中对使用该私钥授予的访问权限进行限制。
例如,选项可以根据授予的 ip 地址访问权限而有所不同from="10.9.8.7"
,您可以限制只能启动 rsynccommand="/bin/rsync"
并阻止交互式登录会话等,no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding
并获取如下形式的条目:
~/.ssh/authorized_keys
command="/bin/rsync",from="10.9.8.7",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAxxxxx..more..public..key..data Comment=This key can only be used for remote backup
答案2
因此,我能够通过在-e
标志中明确指定身份文件的路径来设置同步,如下所示。解决方案比我想要的还要简单。在这种情况下,我不必考虑管理ssh-agent
和添加身份。
rsync -ave "ssh -i /path/to/key" --delete target_server_user@target_server:/path/to/directory/ /path/to/directory