我们可以使用 rsync 来简单地获取远程文件的校验和而不传输它吗?
如果您没有匹配的本地文件可供比较,这对于验证远程文件的完整性非常有用,而无需使用大量带宽。另外,如果您没有对远程计算机的完整 shell 访问权限(因此您不能只是登录并运行md5sum
或其他什么),但可以通过 rsyncd、受限 ssh 等进行 rsync 访问。
答案1
是的,你可以做
rsync --checksum --dry-run --checksum-choice=xxh128 --out-format="%C" host.example.com:/tmp/foo/hello.txt /dev/null
这会将远程文件的 xxh128 校验hello.txt
和以十六进制格式写入标准输出(例如6bba86c7e069f56d5a10b435f1c8e49c
)。
在哪里:
--checksum
强制计算校验和--dry-run
防止任何东西被转移--checksum-choice=xxh128
请求使用 xxh128 哈希算法。您还可以使用xxh64
或md5
或 各种其他的,请参阅rsync --version
您的客户支持的那些。请注意,只有当远程服务器也支持所需的算法时,这才有效。有些服务器可能根本不提供选择。我发现一台服务器(Synology NAS)仅支持 md5,如果
--checksum-choice
未提供,则使用它,但拒绝--checksum-choice-md5
。--out-format="%C"
仅输出每个传输文件的校验和。请参阅中的“日志格式”选项rsyncd.conf(5)您可以输出其他信息。使用--out-format="%C %f"
产生与 相同格式的输出xxh128sum
,可以用作xxh128sum --check
(分别md5sum
等)的输入。/dev/null
只是有一些东西可以作为本地目标文件。如果您没有提供目标文件,则 rsync 仅列出远程文件,但不会向远程服务器询问校验和。
您还可以给出匹配多个远程文件的模式,或用于-r
递归地校验目录树中的所有文件。在这种情况下,请将/dev/null
目标替换为现有本地目录的名称,例如/tmp
.它不会被写入。
请注意,远程 rsync 可能会在生成任何响应之前对所有文件进行校验和,如果出现超时,这可能会出现问题。