sshpass 不会在两台 Linux 机器之间复制完整的数据



我使用 python 和 paramiko 在服务器 A 和服务器 B 之间复制 5GB 文件,脚本将从 serverX 执行,这将从 serverX 打开到服务器 B 的 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

您可能希望使用 SSH 上的 Rsync 而不是带有sshpass(非交互式 ssh 密码提供程序(的scp(安全远程文件复制(。它支持快速增量文件传输(可以恢复未完成的上传(,并且使用 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

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

我想你可以使用

rsync -avP --partial source target

其中sourcetarget可以按所需顺序表示远程服务器路径或本地服务器路径。

最新更新