From 8140f95ce2650f03b6697ad4fc32397fe467f506 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 15 Jul 2025 15:51:16 +0800 Subject: [PATCH] bugfix --- appPublic/sshx.py | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/appPublic/sshx.py b/appPublic/sshx.py index 1d84e84..f5026c3 100644 --- a/appPublic/sshx.py +++ b/appPublic/sshx.py @@ -6,6 +6,7 @@ from contextlib import asynccontextmanager from functools import partial from threading import Thread from appPublic.myTE import tmpTml +from appPublic.log import debug, exception import asyncio, asyncssh, sys class SSHNode: @@ -45,6 +46,33 @@ class SSHNode: def set_jumpers(self, jumpers): self.jumpers = jumpers + async def _connect_server(self, server, refconn=None): + f = asyncssh.connect + if refconn: + f = refconn.connect_ssh + host = server['host'] + username = server.get('username', 'root') + port = server.get('port',22) + password= server.get('password', None) + client_keys = server.get('client_keys', []) + passphrase = server.get('passphrase', None) + if client_keys: + conn = await f(host, + username=username, + known_hosts=None, + keepalive_interval=60, + client_keys=client_keys, + passphrase=passphrase, + port=port) + else: + conn = await f(host, + username=username, + known_hosts=None, + keepalive_interval=60, + password=password, + port=port) + return conn + async def _connect(self, **kw): refconn = kw['refconn'] host = kw['host'] @@ -115,21 +143,20 @@ class SSHNode: @asynccontextmanager async def get_connector(self): refconn = None + connector = [] for jj in self.jumpers: - j = jj.copy() - j['refconn'] = refconn - refconn = await self._connect(**j) - + refconn = await self._connect_server(jj, refconn) + connector.append(refconn) j = self.server2.copy() - j['refconn'] = refconn - conn = await self._connect(**j) + conn = await self._connect_server(j, refconn) try: - yield SshConnector(conn, refconn=refconn) + yield conn except Exception as e: exception(f'{e=}, {format_exc()}') conn.close() - if refconn: - refconn.close() + connector.reverse() + for c in connector: + c.close() def close(self): self.conn.close()