sshpass 不在两台 linux 机器之间复制完整数据

sshpass not copying complete data between two linux machines

我正在使用 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

您可能希望通过 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://whosebug.com/search?q=Python+md5+hash

你可能想查看:What is the fastest hash algorithm to check if two files are equal?

我想你可以使用

rsync -avP --partial source target

其中 sourcetarget 可以是您要求的顺序中的远程服务器路径或本地服务器路径。