Как взаимодействовать с интерактивной оболочкой Paramiko?

У меня есть некоторый код Paramiko, где я использую метод invoke_shell для запроса интерактивного сеанса оболочки SSH на удаленном сервере. Метод описан здесь: invoke_shell ()

Вот краткое изложение соответствующего кода:

sshClient = paramiko.SSHClient()
sshClient.connect('127.0.0.1', username='matt', password='password')
channel = sshClient.get_transport().open_session()
channel.get_pty()
channel.invoke_shell()

while True:
    command = raw_input('$ ')
    if command == 'exit':
        break

    channel.send(command + "\n")

    while True:
        if channel.recv_ready():
            output = channel.recv(1024)
            print output
        else:
            time.sleep(0.5)
            if not(channel.recv_ready()):
                break

sshClient.close()

У меня вопрос: есть ли лучший способ взаимодействия с оболочкой? Вышеописанное работает, но уродливо с двумя подсказками (matt@kali:~$ и $ from raw_input), как показано на скриншоте тестового прогона с интерактивной оболочкой. Я полагаю, мне нужна помощь в записи в stdin для оболочки? Извините, я не много пишу. Заранее спасибо! введите описание изображения здесь

2 ответа

Решение

Я импортировал файл interactive.py, найденный на GitHub Paramiko. После его импорта мне просто нужно было изменить код:

try:
    import interactive
except ImportError:
    from . import interactive

...
...

channel.invoke_shell()
interactive.interactive_shell(channel)
sshClient.close()

Вы можете попробовать отключить echo после вызова удаленной оболочки:

channel.invoke_shell()
channel.send("stty -echo\n")

while True:
    command = raw_input() # no need for `$ ' anymore
    ... ...
Другие вопросы по тегам