scp 完成后我是否需要检查文件是否损坏?

scp 完成后我是否需要检查文件是否损坏?

scp我使用以下命令递归地传输了许多文件和文件夹:

scp -rp /source/folder [email protected]:/destination/folder

传输完成后,我是否需要检查所有文件是否已传输而没有任何损坏,或者是否scp进行了处理(即,如果任何文件未正确传输,则显示一些错误消息)?

答案1

scp验证它是否复制了对方发送的所有数据。传输的完整性由加密通道协议保证。所以转账后不需要验证完整性。这将是多余的,并且不太可能捕获任何硬件错误,因为您要比较的数据可能是从缓存中读取的。定期验证数据可能很有用,但在传输后立即验证是没有意义的。

但是,您确实需要确保这scp不会告诉您出现了问题。应该有一条错误消息,但可靠的指标是,scp如果出现问题,则返回非零退出代码。

scp更准确地说,如果返回 0(即成功状态代码),您就知道文件已正确传输。检查退出状态是否为0无论如何,当您运行任何命令时都是必要的。如果scp返回错误状态,或者被信号终止,或者由于系统崩溃或在运行时断电而永远不会终止,那么您就没有任何保证。特别是,由于scp将文件直接复制到其最终名称,这意味着在系统崩溃时您可能会得到部分文件。复制的部分保证是正确的,但文件可能会被截断。

为了获得更好的可靠性,请使用 rsync 而不是 scp。除非另有指示,否则 rsync 会写入临时文件,并在完成后将其移动到位。因此,如果 rsync 返回成功代码,您就知道该文件存在并且是正确、完整的副本;如果 rsync 未返回错误代码,则不会存在文件(除非该文件存在旧版本,在这种情况下,旧版本不会被修改)。

答案2

我从来没有遇到过腐败问题scp,但如果你担心它,你可以随时md5sum <filename>在两个系统上运行以确保它们是相同的。

答案3

根据 @david-king 的建议,这是一个md5用于在传输后检查文件完整性的基础解决方案。在本地计算机上运行以下命令一次,cd在远程主机上运行一次以下命令: 。成功传输后生成的哈希值应该相同。/source/foldercd/destination/folderfind . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum

更新: 根据这个答案类似的问题服务器故障scp不保证文件完整性(请检查这个答案由@Gilles 获取详细信息)。除了传输后检查文件哈希值之外,您还可以使用它rsync来传输文件并检查其返回代码。

更新2:以下仅检查传输后文件及其各自的大小是否匹配:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

相关内容