3 小时后 Paramiko SSH 连接超时
Paramiko SSH connection timeout after 3 hours
我使用 Paramiko 开发了 Python 两个脚本来在我的虚拟机上传输大量数据 (~120Go)。
我的虚拟机在 OVH 服务器上。
第一个脚本传输 ~ 40Go,第二个脚本 ~ 80Go。
堆栈:
Python 3.9.1
Paramiko 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 分后超时。
我已经阅读了很多很多 post 关于 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 开发人员的新手。
如果有人有解决方案,我采纳!
所以解决方案:
subprocess.run(["winscp.com", "/script=" + cmdFile], shell=True)
如果找不到 winscp.com 之类的命令,请插入以下路径:C:/Program Files (x86)/WinSCP/winscp.com
在 txt 文件中写下你的命令行,这里是 cmdFile。
链接,对你有帮助:
我使用 Paramiko 开发了 Python 两个脚本来在我的虚拟机上传输大量数据 (~120Go)。 我的虚拟机在 OVH 服务器上。 第一个脚本传输 ~ 40Go,第二个脚本 ~ 80Go。
堆栈:
Python 3.9.1
Paramiko 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 分后超时。
我已经阅读了很多很多 post 关于 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 开发人员的新手。 如果有人有解决方案,我采纳!
所以解决方案:
subprocess.run(["winscp.com", "/script=" + cmdFile], shell=True)
如果找不到 winscp.com 之类的命令,请插入以下路径:C:/Program Files (x86)/WinSCP/winscp.com
在 txt 文件中写下你的命令行,这里是 cmdFile。
链接,对你有帮助: