python - 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
解决方案
您可能希望通过 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
您可能想检查:检查两个文件是否相等的最快哈希算法是什么?
推荐阅读
- python - 无法在 Python 中腌制 Tensorflow 对象 - TypeError:无法腌制 _thread._local 对象
- ios - SwiftUI - 使用新页面更新页面视图控制器
- c# - 在实体框架中创建复合键
- swift - 参数类型“()”不符合预期类型“视图”SwiftUI?
- xamarin - 在 Xamarin 中的 ViewModel 之间传递数据对象的最正确方法
- c++ - 为什么在 c++ 中分配 char 数组元素时,分配的字符被破坏?
- python - Python ARIMA 预测返回 NaN
- php - Guzzle 问题缺少输入秘密和缺少输入响应
- python - 如何正确迭代过滤的 AWS 存储桶?
- css - 如何在 ReactJS 中将带有属性的 CSS 转换为 MaterialUI 样式