为什么SCP会卡住?我该如何解决这个问题?

当我尝试使用scp在网络上复制一个文件(大小为)时,出现了一个错误<file> stalled。为什么会发生这种情况?我该如何解决?

我喜欢使用rclone来完成这个任务;我从未遇到过任何问题。 - Hatshepsut
我取消并重新启动了scp命令,问题就解决了。 - kilojoules
4个回答

这是因为scp试图尽可能多地占用带宽,而任何延迟(由防火墙等)都可能使其停滞。使用-l选项限制带宽将解决此问题。
例如,您可能希望将带宽限制为1 MB/s(=8192 Kbits/s):
 scp -l 8192 <file> <destination>

来源:http://www.aixmind.com/?p=1371 - Wayback Machine

谢谢你的回答和提供源链接。但是我认为你的源说-l 8192意味着8192千比特/秒,而-l可能最高支持1兆比特/秒(这在现今似乎有点过时)。 - elmicha
2@elmicha 8192Kb等于1MB - Lelouch Lamperouge
@Eknath 哎呀,你说得对。 - elmicha
2只是为了澄清一下:这个例子将scp的带宽限制在8192 Kbit/秒。源文章的作者建议这个数字对于最高1 Mbit/秒的连接应该能够正常工作。 - Erwin Wessels
1工作得很顺利 :) - Saurabh
@LelouchLamperouge 8192Kb==1MB 不完全正确,8192 Kbit 是 1 kiB! - Melebius

我已经通过使用rsync解决了这个问题。
rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress /tmp/bigfile.txt user@host.com:/tmp/

有没有可能你在使用Cisco ASA防火墙?如果是的话,关闭“序列号随机化”会有很大帮助 - 如果你的服务器上使用了Broadcom网卡,请同时禁用TCP Offload(ethtool -K $INTERFACE tso off gso off gro off)。

太天才了。这个更改是永久的还是我需要在某个地方设置命令?只是为了明确,您必须在您的网络接口卡(NIC)上进行设置,而不是在cscotun接口上。 - mjaggard

鉴于我们在scp停顿时收到的错误信息,我怀疑是加密出了问题。 “无法确认主机'myserver(10.10.11.12)'的真实性。 ECDSA密钥指纹为SHA256:+zkyskXlxVQ0kRorLW26pzprIYbsM4N3hbaDLz1RNpo" 考虑到这一点,我运行了"scp -c aes128-ctr /tmp/test.dan/bigfile.src myserver:/tmp/bigfile"。使用替代密码算法,scp成功了。默认密码算法是否存在缓冲空间的问题? 你可以尝试添加"-c "并使用替代密码算法,看看是否能解决停顿的问题。