Как программно ввести escape-символы для telnet? - PullRequest
4 голосов
/ 06 июня 2011

Я использую paramiko для ssh на удаленной машине, похоже, что пока все работает нормально

client.connect(hostname, port=ssh_port, username=username, key_filename=key_fname, password=password)

Теперь с удаленной машины мне нужно пойти глубже,и использование

stdin, stdout, stderr = client.exec_command('telnet localhost %d'%port)

, кажется, дает мне правильные ручки для начала разговора, используя stdin.write

Моя проблема в том, что когда я закончу, я нене знаю, как правильно выйти из telnet.Если я делаю это вручную, я могу зайти в телнет и увидеть: Escape character is '^]'. Я могу использовать Ctrl+] на клавиатуре, и появится небольшое меню с сообщением

Console escape. Commands are:

 l  go to line mode
 c  go to character mode
 z  suspend telnet
 e  exit telnet

, а затем яв состоянии выйти, нажав «e» (он завершает работу немедленно, без необходимости вводить клавишу «Enter»)

Но когда я пытаюсь сделать это в моем скрипте, с помощью stdin.write('^]e'), stdin.write('\^]e'), stdin.write('\c]e'),stdin.write('\M-\C-]e') и т. Д. Я все время вижу в stdout.read(), что мой сценарий буквально вводит эти символы.Помещение небольшого числа time.sleep(0.1) между ] и e, похоже, не помогает.

Как программно ввести эту escape-последовательность?

1 Ответ

6 голосов
/ 07 июня 2011

Наконец-то я с этим разобрался.

Краткий ответ: '\x1d'

Это escape-последовательность для вызова маленького меню.Я нашел это через curses модуль:

from curses.ascii import ctrl
print ctrl(']')
...