This commit is contained in:
yumoqing 2025-07-15 15:51:16 +08:00
parent 4cb71227a1
commit 8140f95ce2

View File

@ -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()