Как использовать библиотеки Python, такие как Paramiko, для цепных соединений с Telnet и SSH
Похоже на вопрос, заданный здесь: SSH и telnet на localhost с использованием python
Я пытаюсь найти решение следующей проблемы:
С сервера A (полные права) через Jumhost B (без sudo) я хочу подключиться к нескольким сетевым устройствам с помощью Python (достаточно одного за другим, это не обязательно должно происходить одновременно). Только с SSH это не составило бы проблем, но многие устройства используют только Telnet (я знаю, что это небезопасно, но я так не решил).
После исследования я наткнулся на несколько решений для цепных SSH-соединений, таких как Paramiko, Netmiko, Pxssh и т. Д. Но я не могу найти подходящий способ для достижения последнего шага с Telnet. В настоящее время у меня есть следующий код:
class SSHTool():
def __init__(self, host, user, auth,
via=None, via_user=None, via_auth=None):
if via:
t0 = ssh.Transport(via)
t0.start_client()
t0.auth_password(via_user, via_auth)
# setup forwarding from 127.0.0.1:<free_random_port> to |host|
channel = t0.open_channel('direct-tcpip', host, ('127.0.0.1', 0))
self.transport = ssh.Transport(channel)
else:
self.transport = ssh.Transport(host)
self.transport.start_client()
self.transport.auth_password(user, auth)
def run(self, cmd):
ch = self.transport.open_session()
ch.set_combine_stderr(True)
ch.exec_command(cmd)
retcode = ch.recv_exit_status()
buf = ''
while ch.recv_ready():
buf += str(ch.recv(1024))
return (buf, retcode)
host = ('192.168.0.136', 22)
via_host = ('192.168.0.213', 22)
ssht = SSHTool(host, '', '',
via=via_host, via_user='', via_auth='')
output=ssht.run('ls')
print(output)
Благодаря этому я могу подключиться к своему Jumphost, но я не знаю, как реализовать соединение Telnet. Кто-нибудь знает правильное решение?
1 ответ
Вы не можете использовать класс "канал" с Telnet
учебный класс. Telnet
класс должен подключиться к хосту: порт. Таким образом, вам нужно начать слушать локальный временный порт и переслать его в класс "канал". Там готовый forward_tunnel
функция в Парамико forward.py
Демо именно для этого:
forward_tunnel(local_unique_port, telnet_host, 23, t0)
telnet = Telnet("localhost", local_unique_port)