From afe9005137fe871e559bb30fd47614662f7cc61f Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 14 Apr 2025 13:09:57 +0800 Subject: [PATCH] bugfix --- appPublic/sshx.py | 98 ++++++++++++++++++++++++++++++----------------- requirements.txt | 3 +- 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/appPublic/sshx.py b/appPublic/sshx.py index f83c465..4dcf01a 100644 --- a/appPublic/sshx.py +++ b/appPublic/sshx.py @@ -12,11 +12,15 @@ class SSHNode: username='root', port=22, password=None, + client_keys=[], + passphrase=None, jumpers=[]): self.server2 = { "host":host, "username":username, "password":password, + "client_keys":client_keys, + "passphrase":passphrase, "port":port } print(self.server2) @@ -40,47 +44,72 @@ class SSHNode: def set_jumpers(self, jumpers): self.jumpers = jumpers - async def connect(self): - refconn = None - for j in self.jumpers: - host = j['host'] - username = j.get('username', 'root') - port = j.get('port',22) - password= j.get('password', None) - if refconn: - refconn = await refconn.connect_ssh(host, - username=username, - known_hosts=None, - keepalive_interval=60, - password=password, - port=port) - else: - refconn = await asyncssh.connect(host, - username=username, - known_hosts=None, - keepalive_interval=60, - password=password, - port=port) - self.jumper_conns.append(refconn) - - host = self.server2['host'] - username = self.server2.get('username', 'root') - port = self.server2.get('port',22) - password = self.server2.get('password', None) + async def _connect(self, **kw): + refconn = kw['refconn'] + host = kw['host'] + username = kw.get('username', 'root') + port = kw.get('port',22) + password= kw.get('password', None) + client_keys = kw.get('client_keys', []) + passphrase = kw.get('passphrase', None) + conn = None if refconn: - self.conn = await refconn.connect_ssh(host, + if password: + conn = await refconn.connect_ssh(host, username=username, - port=port, - password=password, + known_hosts=None, keepalive_interval=60, - known_hosts=None) - else: - self.conn = await asyncssh.connect(host, - username=username, password=password, + port=port) + elif client_keys != []: + conn = await refconn.connect_ssh(host, + username=username, + known_hosts=None, + keepalive_interval=60, + client_keys=client_keys, + passphrase=passphrase, + port=port) + else: + conn = await refconn.connect_ssh(host, + username=username, known_hosts=None, keepalive_interval=60, port=port) + + else: + if password: + conn = await asyncssh.connect(host, + username=username, + known_hosts=None, + keepalive_interval=60, + password=password, + port=port) + elif client_keys: + conn = await asyncssh.connect(host, + username=username, + known_hosts=None, + keepalive_interval=60, + client_keys=client_keys, + passphrase=passphrase, + port=port) + else: + conn = await asyncssh.connect(host, + username=username, + known_hosts=None, + keepalive_interval=60, + port=port) + return conn + + async def connect(self): + refconn = None + for jj in self.jumpers: + j = jj.copy() + j['refconn'] = refconn + refconn = await self._connect(**j) + + j = self.server2.copy() + j['refconn'] = refconn + self.conn = await self._connect(**j) def close(self): self.conn.close() @@ -113,7 +142,6 @@ class SSHNode: show_input=None, show_stdout=None): proc = await self._process(cmd, term_type='xterm', - term_size=(80,24), encoding='utf-8' ) diff --git a/requirements.txt b/requirements.txt index d71654a..59b3a76 100755 --- a/requirements.txt +++ b/requirements.txt @@ -17,5 +17,6 @@ requests jinja2 pyzmq cryptography -asyncssh==2.13.2 +bcrypt +asyncssh eventpy