【发布时间】:2021-05-31 19:25:49
【问题描述】:
我使用 Paramiko 开发了一个 Python 两个脚本来在我的虚拟机上传输大量数据 (~120Go)。 我的虚拟机在 OVH 服务器上。 第一个脚本 transfert ~ 40Go,第二个脚本 ~ 80Go。
堆栈:
Python 3.9.1
帕拉米科 2.7.2
SCP 0.13.3
在我的两个脚本中,我使用这个函数来设置 SSH 连接。
def connect():
transport = paramiko.Transport((target_host, target_port))
transport.connect(None, target_username, target_pwd)
sftp_client = paramiko.SFTPClient.from_transport(transport)
green_print("SSH connected")
return sftp_client, transport
如果我创建一个执行两次传输的脚本,我会在 3 小时后超时。
由于两个不同的脚本同时运行,我在传输 2 小时 30 后超时。
我已经阅读了很多很多关于 Paramiko、SSH 连接、超时参数、ClientAliveInterval 等的帖子……但没有任何效果。
在这段时间之后,我有这个错误
Connexion fermée par l'hôte distant / Connection closed by remote host
我的脚本的三个功能:
def connect():
transport = paramiko.Transport((target_host, target_port))
transport.connect(None, target_username, target_pwd)
sftp_client = paramiko.SFTPClient.from_transport(transport)
green_print("SSH connected")
return sftp_client, transport
def transfert(sftp, vm, object_path):
os.chdir(os.path.split(object_path)[0])
parent = os.path.split(object_path)[1]
try:
sftp.mkdir(vm)
except:
pass
for path, _, files in os.walk(parent):
try:
sftp.mkdir(os.path.join(vm, path))
except:
pass
for filename in files:
sftp.put(os.path.join(object_path, filename),
os.path.join(vm, path, filename))
def job():
green_print("\nProcess start...")
check_folder()
folder = forfiles_method()
vm, lidar, pos = name_path(folder)
sftp, transport = connect()
transfert(sftp, vm, pos)
sftp.close()
transport.close()
最小的可重现示例:
from paramiko.sftp_client import SFTPClient
import paramiko
import os
target_host = 'xx.xx.x.xxx'
target_port = 22
target_username = "xxxxxxx"
target_pwd = 'xxxxxx'
remote_path = "e:/x/" # => on your vm
target_folder = '/folder1' # => on your computer
def connect():
transport = paramiko.Transport((target_host, target_port))
transport.connect(None, target_username, target_pwd)
sftp_client = paramiko.SFTPClient.from_transport(transport)
return sftp_client, transport
def transfert(sftp, remote_path, object_path):
os.chdir(os.path.split(object_path)[0])
parent = os.path.split(object_path)[1]
try:
sftp.mkdir(remote_path)
except:
pass
for path, _, files in os.walk(parent):
try:
sftp.mkdir(os.path.join(remote_path, path))
except:
pass
for filename in files:
sftp.put(os.path.join(object_path, filename),
os.path.join(remote_path, path, filename))
def job():
sftp, transport = connect()
transfert(sftp, remote_path, target_folder)
sftp.close()
transport.close()
我的文件的树形结构,我只想传输包含超过 120GB 的“test”文件夹。
文件夹/测试
我是 Python 开发新手。 如果有人有解决方案,我会接受!
【问题讨论】:
标签: python-3.x ssh timeout paramiko scp