我查看了受限的 rsync 脚本,同步,这是在 中提到的man rsync
。基本上,客户端rsync
命令似乎将其所有选项传递给通过rsync
SSH 运行的远程命令。 rrsync
是一个 200 多行 Perl 脚本,人们使用它来限制服务器允许的路径和选项。我对此的第一反应是“啊”。rsync
文档故意模糊地说明该选项的实际使用方式,这无济于事--server
。
我还发现 2016 年的错误报告显示巨大的安全漏洞在rrsync
。它仍然没有修复。
:-(
我更愿意使用定义合法目标和选项rsyncd.conf
。同时,我想使用 SSH 加密和身份验证来保护我与 rsync 服务器的连接。
它看起来就像我可以使用~/.authorized_keys
专用 SSH 密钥以及限制它的选项来完成此操作,例如command="/usr/bin/rsync --server --daemon --config=./rsyncd.conf .",restrict
.然后我可以rsync
使用守护程序语法运行我的客户端命令:rsync -e "ssh" "$SOURCE_PATH" "$SSH_HOST"::"$RSYNC_MODULE"/"$DEST_PATH"
。
(如果您不使用 SSH 密钥,您可以使用专用用户、/etc/sshd_config
Match 和 ForceCommand 执行相同的操作。但目前还没有相当于毯子的功能restrict
,您必须单独禁用所有权限)。
这工作可靠吗?
我测试了几个不同的选项。即使我向客户端命令添加选项(rsync
例如.rsync --server --daemon .
-vlogDtprze.iLsf --numeric-ids
问题:我可以依赖上述内容吗?或者相反,是否存在客户端可能需要使用一组不同的选项来启动守护程序服务器的情况?
第三个参数 - .
- 是否设置为其他值?它有什么作用??
答案1
是的,我认为这是一个相当安全的假设。
这是它工作的自然方式。尽管他们避免记录这些细节,但在未来的版本中它很可能会继续以同样的方式工作。的命令行选项rsync --server
实际上是网络协议的一部分,并且通常是向后兼容的。
- 源代码
- 《文献综述》(几条推荐,无差评)
1. 源代码
源代码似乎相当清楚,在“daemon_over_rsh”模式下,它总是使用命令行选项运行服务器端--server --daemon .
,而不是其他任何东西。
(我希望有一个选项可以运行不同的rsync
,例如/home/alan/rsync-custom-build/rsync
。但你已经知道你是否正在这样做)。
2390 void server_options(char **args, int *argc_p)
2391 {
2392 static char argstr[64];
2393 int ac = *argc_p;
2394 uchar where;
2395 char *arg;
2396 int i, x;
2397
2398 /* This should always remain first on the server's command-line. */
2399 args[ac++] = "--server";
2400
2401 if (daemon_over_rsh > 0) {
2402 args[ac++] = "--daemon";
2403 *argc_p = ac;
2404 /* if we're passing --daemon, we're done */
2405 return;
2406 }
512 server_options(args,&argc);
513
514 if (argc >= MAX_ARGS - 2)
515 goto arg_overflow;
516 }
517
518 args[argc++] = ".";
519
520 if (!daemon_over_rsh) {
...
534 }
535
536 args[argc] = NULL;
第三个参数 -
.
- 是否设置为其他值?它有什么作用??
不,它没有任何作用。
至少需要一个非选项参数。如果没有它,rsync
将打印--help
消息并返回退出代码 1。虽然当我运行时rsync --server --daemon
,帮助消息被写入系统日志而不是标准错误(即终端)。
尽管这是必需的,但 的非选项参数将rsync --server --daemon
被完全忽略。
1661 if (argc < 1) {
1662 usage(FERROR);
1663 exit_cleanup(RERR_SYNTAX);
1664 }
1665
1666 if (am_server) {
1667 set_nonblocking(STDIN_FILENO);
1668 set_nonblocking(STDOUT_FILENO);
1669 if (am_daemon)
1670 return start_daemon(STDIN_FILENO, STDOUT_FILENO);
1671 start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
1672 }
2。文献综述”
谷歌搜索词:
- rsync 守护进程服务器(sshd_config forcecommand)或(authorized_keys 命令)
- 通过 ssh 的 rsync 守护进程模式
我扫描了结果的第一页。我发现了一些积极的建议,并且没有关于这个具体问题的负面反馈。缺乏负面反馈并不是强有力的证据。对我来说,安全漏洞rrsync
似乎是一个更重要的问题,但我只是因为搜索““rrsync”munge links”才发现它。谷歌没有找到任何外部引用,只找到了错误报告本身。
- https://gist.github.com/trendels/6582e95012f6c7fc6542
- https://indico.cern.ch/event/577279/contributions/2354037/attachments/1366772/2071442/Hepsysman-keeping-in-sync.pdf
- https://serverfault.com/questions/6367/cant-get-rsync-to-work-in-daemon-over-ssh-mode
- 由于某种原因,使用具有自定义 shell 的专用用户而不是
command=""
/ 的不寻常变体:ForceCommand
http://mennucc1.debian.net/howto-ssh-rsyncd.html