我使用scp
,使用递归传输了许多文件和文件夹:
scp -rp /source/folder myremoteusername@122.10.12.123:/destination/folder
传输完成后,我是否需要检查所有文件是否都已传输而没有损坏,或者是否已scp
妥善处理(即,如果未正确传输任何文件,则会显示一些错误消息)?
rsync
如果可以的话使用。事务完成后,它会为每个文件复制验证,因此最好使用它以更加安全。
我使用scp
,使用递归传输了许多文件和文件夹:
scp -rp /source/folder myremoteusername@122.10.12.123:/destination/folder
传输完成后,我是否需要检查所有文件是否都已传输而没有损坏,或者是否已scp
妥善处理(即,如果未正确传输任何文件,则会显示一些错误消息)?
rsync
如果可以的话使用。事务完成后,它会为每个文件复制验证,因此最好使用它以更加安全。
Answers:
scp
验证是否复制了另一方发送的所有数据。加密通道协议保证了传输的完整性。因此,您无需在传输后验证完整性。这将是多余的,并且极不可能捕获任何硬件错误,因为与之比较的数据可能会从缓存中读取。定期验证数据可能很有用,但是在传输之后立即进行验证是没有意义的。
但是,您确实需要确保scp
不会告诉您出了什么问题。应该有一条错误消息,但是可靠的指示符是scp
如果出现问题,则返回非零退出代码。
更准确地说,您知道如果scp
返回0(即成功状态代码),则文件已正确传输。无论如何,运行任何命令时都必须检查退出状态为0。如果scp
返回错误状态,或者被信号杀死,或者由于系统崩溃或在运行时断电而永不消失,那么您将无法保证。特别是,由于scp
直接将文件复制到其最终名称,这意味着在系统崩溃的情况下,您可能会得到部分文件。确保复制的部分正确无误,但文件可能会被截断。
为了获得更高的可靠性,请使用rsync而不是scp。除非另有指示,否则rsync会写入一个临时文件,并在完成后将其移到适当位置。因此,如果rsync返回成功代码,则说明文件存在,并且是正确,完整的副本。如果rsync尚未返回错误代码,则将不存在任何文件(除非存在文件的较旧版本,在这种情况下,不会修改较旧版本)。
根据@ david-king的建议,这是md5
用于检查传输后文件完整性的基础解决方案。一旦后运行以下命令cd
荷兰国际集团,以/source/folder
在本地机器上,一次之后cd
荷兰国际集团到/destination/folder
远程主机上:find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum
。成功传输后,生成的哈希应该相同。
更新: 根据对ServerFault的类似问题的回答,不保证文件完整性(有关详细信息,请通过@Gilles 查看此答案)。scp
rsync
除了对文件哈希进行传输后检查以外,您还可以用来传输文件并检查其返回码。
更新2:以下内容仅检查传输后文件及其各自大小是否匹配:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum
scp
的返回码就足够了,而检查散列则毫无用处。
scp
返回0也不能保证文件系统没有搞乱,因此如果有人选择使用scp
over ,则检查散列对于检查敏感数据的完整性仍然很有用rsync
。
scp
并且给stderr附带错误消息,否则它将正确且完整地复制了所有内容。