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


17

我使用scp,使用递归传输了许多文件和文件夹:

scp -rp /source/folder myremoteusername@122.10.12.123:/destination/folder

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


除非您从那里获得非零的退出状态scp并且给stderr附带错误消息,否则它将正确且完整地复制了所有内容。
roaima

一点tl;博士到我的岗位:rsync如果可以的话使用。事务完成后,它会为每个文件复制验证,因此最好使用它以更加安全。
polemon '16

Answers:


24

scp验证是否复制了另一方发送的所有数据。加密通道协议保证了传输的完整性。因此,您无需在传输后验证完整性。这将是多余的,并且极不可能捕获任何硬件错误,因为与之比较的数据可能会从缓存中读取。定期验证数据可能很有用,但是在传输之后立即进行验证是没有意义的。

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

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

为了获得更高的可靠性,请使用rsync而不是scp。除非另有指示,否则rsync会写入一个临时文件,并在完成后将其移到适当位置。因此,如果rsync返回成功代码,则说明文件存在,并且是正确,完整的副本。如果rsync尚未返回错误代码,则将不存在任何文件(除非存在文件的较旧版本,在这种情况下,不会修改较旧版本)。


3

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


3

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

更新: 根据对ServerFault的类似问题的回答,不保证文件完整性scp(有关详细信息,请通过@Gilles 查看此答案)。rsync除了对文件哈希进行传输后检查以外,您还可以用来传输文件并检查其返回码。

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


2
如果scp返回0,则可以保证完整性。此外,如果scp不返回0,那么问题就不在于泛型损坏,而是特别是截断。验证文件大小是否足够(除非目标文件已经存在较旧的版本:如果scp很早就被中断,则仍可能存在较旧的版本)。在此处验证校验和是浪费时间。
吉尔(Gilles)'所以

公平。我更新了答案。
Mani M

您没有解决基本缺陷。检查scp的返回码就足够了,而检查散列则毫无用处。
吉尔斯(Gilles)'所以

1
即使scp返回0也不能保证文件系统没有搞乱,因此如果有人选择使用scpover ,则检查散列对于检查敏感数据的完整性仍然很有用rsync
Mani M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.