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。

链接,对你有帮助:

https://winscp.net/eng/docs/commandline