![scp 完成后我是否需要检查文件是否损坏?](https://linux22.com/image/80704/scp%20%E5%AE%8C%E6%88%90%E5%90%8E%E6%88%91%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E6%8D%9F%E5%9D%8F%EF%BC%9F.png)
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/folder
cd
/destination/folder
find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum
更新: 根据这个答案类似的问题服务器故障,(请检查这个答案由@Gilles 获取详细信息)。除了传输后检查文件哈希值之外,您还可以使用它scp
不保证文件完整性rsync
来传输文件并检查其返回代码。
更新2:以下仅检查传输后文件及其各自的大小是否匹配:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum