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 functools import partial
from threading import Thread from threading import Thread
from appPublic.myTE import tmpTml from appPublic.myTE import tmpTml
from appPublic.log import debug, exception
import asyncio, asyncssh, sys import asyncio, asyncssh, sys
class SSHNode: class SSHNode:
@ -45,6 +46,33 @@ class SSHNode:
def set_jumpers(self, jumpers): def set_jumpers(self, jumpers):
self.jumpers = 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): async def _connect(self, **kw):
refconn = kw['refconn'] refconn = kw['refconn']
host = kw['host'] host = kw['host']
@ -115,21 +143,20 @@ class SSHNode:
@asynccontextmanager @asynccontextmanager
async def get_connector(self): async def get_connector(self):
refconn = None refconn = None
connector = []
for jj in self.jumpers: for jj in self.jumpers:
j = jj.copy() refconn = await self._connect_server(jj, refconn)
j['refconn'] = refconn connector.append(refconn)
refconn = await self._connect(**j)
j = self.server2.copy() j = self.server2.copy()
j['refconn'] = refconn conn = await self._connect_server(j, refconn)
conn = await self._connect(**j)
try: try:
yield SshConnector(conn, refconn=refconn) yield conn
except Exception as e: except Exception as e:
exception(f'{e=}, {format_exc()}') exception(f'{e=}, {format_exc()}')
conn.close() conn.close()
if refconn: connector.reverse()
refconn.close() for c in connector:
c.close()
def close(self): def close(self):
self.conn.close() self.conn.close()