我在网上找到了一篇文章,其中提供了有关如何使用 rsync 备份专用服务器的说明。
在本文的其中一个步骤中,我应该创建一个名为“rsync”的用户并为其添加 sudo 权限。一切进展顺利,但“rsync”用户的 visudo 选项相当难理解。“/usr/bin/rsync”命令的某些选项在互联网上几乎没有文档。
以下是我所指的 visudo 行:
rsync ALL=(ALL) NOPASSWD: /usr/bin/rsync --server --sender -logDtprze.iLsf --numeric-ids . /
首先,我大概了解“--server --sender”属性。真正让我烦恼的是“-logDtprze.iLsf”选项。
我有一台 CentOS 服务器,当我运行命令“man rsync”时,rsync 文档中没有此选项。实际上,每次我尝试在 visudo 中使用此选项时,都不起作用。
我最终找到了一个模糊的参考资料,其中提到“-logDtprze.iLsf”是 Debian 中 rsync 的一个新功能。我对此并不确定。
我只是想知道这个选项的作用以及是否可以在我的备份设置中忽略它。
我还想了解行末句号和斜线“。/”的用途
编辑:谢谢bodgit!我觉得自己像个白痴!:)
答案1
它是短选项-l
、-o
、-g
、-D
等,可以折叠起来而不必单独拼写出来,这是大多数 Unix 工具的标准行为,即rm -rf
与 相同rm -r -f
。
答案2
正如其他评论所指出的那样,-logDtprze.iLsf
是短选项的组合,但微妙之处在于-e.
部分。因为-e
需要一个参数,所以它后面的所有内容都是选项的值-e
。这是 Unix 命令短选项的常见行为,我们可以通过查看来确认此行为弹出(3)POPT_ARG_STRING
(rsync 用于解析选项的库)。因此它相当于:
-l -o -g -D -t -p -r -z -e '.iLsf'
虽然-e
在 rsync 上有记录客户--rsh
作为“指定要使用的远程 shell”的缩写,.iLsf
作为远程 shell 没有多大意义。该-e
选项实际上被内部 rsync 客户端/服务器协议劫持,以传递兼容性标志:https://github.com/WayneD/rsync/blob/13c4019e94015b234697c75d9d3624862e962d3c/compat.c#L160
maybe_add_e_option
您可以在此处的函数中看到其构造方式的源代码options.c
:https://github.com/WayneD/rsync/blob/f44e76b65c5819edb1a5b2fbbe732d5d214b35de/options.c#L2951
它的解析如下compat.c
:https://github.com/WayneD/rsync/blob/13c4019e94015b234697c75d9d3624862e962d3c/compat.c#L134
.iLsf
意思是:
.
:rsync 使用的是协议的最终版本。如果它使用的是预发布版本(其中SUBPROTOCOL_VERSION != 0
),它将发送<PROTOCOL_VERSION>.<SUBPROTOCOL_VERSION>
而不是仅仅.
接下来是一些行为标志,如下client_info
所示compat.c
:
i
:allow_inc_recurse
L
:符号链接时间设置支持s
:符号链接 iconv 翻译支持f
:flist I/O 错误安全支持
答案3
我做了一些调查,发现了参数序列“-logDtprze.iLsf”中每个字母的含义
-l, --links copy symlinks as symlinks
-o, --owner preserve owner (super-user only)
-g, --group preserve group
-D, --devices transfer character and block device files
-t, --times preserve modification times
-p, --perms preserve permissions
-r, --recursive copy directories recursively
-z, --compress compresses data as it is sent to the destination
-e, --rsh=COMMAND allows to choose an alternative remote shell program
.
-i, --itemize-changes show list of changes being made to each file
-L, --copy-links transform symlink into referent file/dir
-s, --protect-args no space-splitting; wildcard chars only
-f, --filter=RULE allows to add rules to exclude certain files
我唯一无法理解的是参数中间的句点“。”的含义。
答案4
您偶然发现了 RSYNC 通过 SSH 会话的几个部分之间相当复杂的交互。
虽然这里的其他答案对 rsync 选项提供了一些见解,但这些选项不一定适用于您的特定情况,具体取决于您发送给 rsync 的选项。
所以,不,忽略这些选项是不行的,因为它们可能与您的情况完全不同。
这组看似奇怪的 rsync 选项的真正关键在于捕获正在发送的实际命令针对您的具体情况。
至少有几种方法可以做到这一点。一种方法是使用 rsync 备份一个足够大的文件,传输时间大约为 20 秒,以便在传输过程中有机会检查远程机器上运行的进程,例如以下命令:
rsync -a -e "ssh -i /Users/myuser/keys/id_test -l test" 192.168.1.101:/home/test/100m.txt /Users/myuser/100m.txt
其中 /home/test/100m.txt 是一个足够大的文件,需要足够长的时间来查看传输过程中的过程。
要查看 rsync 通过 ssh 使用的实际命令,请在单独的终端窗口登录到远程计算机并执行
ps auxww|grep rsync
在文件传输过程中。在我的情况下,执行上述操作会得到:
# ps auxww|grep rsync
test 3860 7.5 0.0 13520 2780 ? Ss 18:49 0:00 rsync --server --sender -logDtpr . /home/test/100m.txt
root 3862 0.0 0.0 12784 968 pts/0 S+ 18:49 0:00 grep rsync
这样就可以了解所有这些 rsync 命令选项来自哪里,在我的例子中,“logDtpr”来自执行“rsync -a”,YMMV。
查找正在发送的命令的另一种方法是使用环境变量 SSH_ORIGINAL_COMMAND,来自 man SSH:
SSH_ORIGINAL_COMMAND This variable contains the original command line if a forced command is executed. It can be used to extract the original arguments.
然后,您可以使用 authorized_keys 选项(参见 man SSHD 中的 AUTHORIZED_KEYS FILE FORMAT 条目)向用于登录远程服务器的密钥添加强制命令“command=myscript”,并使该命令成为一个 shell 脚本“myscript”,其中包含几行内容,例如:
echo "$SSH_ORIGINAL_COMMAND" >> /fullpathto/mysshlog
exec $SSH_ORIGINAL_COMMAND
然后当你运行 rsync 时,实际使用的命令将最终出现在日志文件“mysshlog”中
您可以从上面第一个示例中的命令中看到,对于您的情况,尾随的 / 将是要复制的 rsync 文件的源路径。