scp会丢包吗?

scp会丢包吗?

上周我尝试将 200 MB 的文件传输到远程计算机。然后我得到了一个 30 MB 的文件。今天我尝试 scp 整个目录,但丢失了大量文件。

scp正常吗?如何防止这种情况发生?

编辑:

我在 scp 文件中编写了一个 Expect 脚本,它是否相关?

这个脚本非常简单:

#!/usr/bin/expect
set file [lindex $argv 0];
set ip [lindex $argv 1];
spawn scp -r $file $ip
expect {
    "*password*" {send "password\r"}
    "*(yes/no)?*" {send "yes\r";exp_continue}
}
expect eof

没有错误消息,但只是丢失了未复制的文件。

答案1

scp 不能保证复制会正确发生。没有软件可以保证复制正确进行。总是有可能出现断电或网络故障、源文件无法读取或目标卷已满等情况。

文件复制软件最多可以保证在退出时,要么复制正确,要么软件报告错误。检查错误的可靠方法是检查进程的返回状态:0 表示成功,任何其他值表示错误。 Scp 与任何半途而废的程序一样,成功时返回 0,失败时返回非零值。

您的 Expect 脚本不会检查 的返回状态scp,因此您无法知道 scp 是否告诉您复制成功。

Expect 在这里并不是一个有用的工具。你真的应该使用公钥认证。如果你真的真的无法设置密钥,那么使用sshpass而不是自己滚动。

另外,你应该使用同步而不是 scp。 Rsync 有一个主要优点:如果复制被中断,您可以再次运行它,它会从上次中断的地方开始。请务必告诉它保留时间戳以及其他元数据,除非您有充分的理由不这样做:

rsync -a SOURCE/ DESTINATION/

相关内容