Как использовать библиотеки 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)
Другие вопросы по тегам