Как использовать библиотеки Python, такие как Paramiko, для цепных соединений с Telnet и SSH - PullRequest
0 голосов
/ 20 декабря 2018

Аналогично заданному здесь вопросу: 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 Ответ

0 голосов
/ 20 декабря 2018

Вы не можете использовать класс "channel" с классом Telnet.Telnet класс должен подключаться к порту host :.Таким образом, вам нужно начать слушать локальный временный порт и переслать его в класс «канал».Для этой цели есть готовая forward_tunnel функция Paramiko forward.py demo :

forward_tunnel(local_unique_port, telnet_host, 23, t0)
telnet = Telnet("localhost", local_unique_port)
...