This commit is contained in:
yumoqing 2025-04-14 13:09:57 +08:00
parent dbfe00df59
commit afe9005137
2 changed files with 65 additions and 36 deletions

View File

@ -12,11 +12,15 @@ class SSHNode:
username='root', username='root',
port=22, port=22,
password=None, password=None,
client_keys=[],
passphrase=None,
jumpers=[]): jumpers=[]):
self.server2 = { self.server2 = {
"host":host, "host":host,
"username":username, "username":username,
"password":password, "password":password,
"client_keys":client_keys,
"passphrase":passphrase,
"port":port "port":port
} }
print(self.server2) print(self.server2)
@ -40,47 +44,72 @@ class SSHNode:
def set_jumpers(self, jumpers): def set_jumpers(self, jumpers):
self.jumpers = jumpers self.jumpers = jumpers
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:
if password:
conn = await refconn.connect_ssh(host,
username=username,
known_hosts=None,
keepalive_interval=60,
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): async def connect(self):
refconn = None refconn = None
for j in self.jumpers: for jj in self.jumpers:
host = j['host'] j = jj.copy()
username = j.get('username', 'root') j['refconn'] = refconn
port = j.get('port',22) refconn = await self._connect(**j)
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'] j = self.server2.copy()
username = self.server2.get('username', 'root') j['refconn'] = refconn
port = self.server2.get('port',22) self.conn = await self._connect(**j)
password = self.server2.get('password', None)
if refconn:
self.conn = await refconn.connect_ssh(host,
username=username,
port=port,
password=password,
keepalive_interval=60,
known_hosts=None)
else:
self.conn = await asyncssh.connect(host,
username=username,
password=password,
known_hosts=None,
keepalive_interval=60,
port=port)
def close(self): def close(self):
self.conn.close() self.conn.close()
@ -113,7 +142,6 @@ class SSHNode:
show_input=None, show_input=None,
show_stdout=None): show_stdout=None):
proc = await self._process(cmd, term_type='xterm', proc = await self._process(cmd, term_type='xterm',
term_size=(80,24), term_size=(80,24),
encoding='utf-8' encoding='utf-8'
) )

View File

@ -17,5 +17,6 @@ requests
jinja2 jinja2
pyzmq pyzmq
cryptography cryptography
asyncssh==2.13.2 bcrypt
asyncssh
eventpy eventpy