首页 > 解决方案 > sshpass 不能在两台 linux 机器之间复制完整的数据

问题描述

我正在使用 python 和 paramiko 在服务器 A 和服务器 B 之间复制一个 5GB 的文件,脚本将从 serverX 执行,这将从 serverX 打开一个到 serverb 的 ssh 会话并运行命令以使用 sshpass 从服务器 B 复制文件。脚本正在运行,但它没有复制完整的 5GB 文件。它只复制了一半,有时还不到一半。

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(serverb, username=user, password=password)

try:
    stdin, stdout, stderr = client.exec_command("sshpass -p password scp -v -r root@serverA:/tmp/file_to_copy_name /tmp/",timeout=None)
except Exception as err:
    print("copy between server error")
    raise

标签: pythonparamikosshpass

解决方案


您可能希望通过 SSH 使用 Rsync 而不是scp安全远程文件复制)和sshpass非交互式 ssh 密码提供程序)。它支持快速增量文件传输(可以恢复未完成的上传),并且使用 SSH 密钥比通过sshpass传递原始密码更安全。

就像是:

rsync -az /root/bigfile.txt 198.211.117.129:/root/

-a用于归档模式 -z以在传输过程中压缩文件数据

手册:https
://download.samba.org/pub/rsync/rsync.html 此外,它可以恢复以 scp 开始的复制。

以下是如何通过 SSH 使用它的说明: https ://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh

此外,正如@pynexj 已经指出的那样,client.exec_command()不会等到命令执行完成。因此,您可能希望有一些替代方法来检查文件是否已成功复制并具有与源相同的数据。选项之一可能是检查 MD5 哈希:https ://stackoverflow.com/search?q=Python+md5+hash

您可能想检查:检查两个文件是否相等的最快哈希算法是什么?


推荐阅读