如何以编程方式输入telnet的转义字符?

4 投票
1 回答
11107 浏览
提问于 2025-04-16 19:00

我正在使用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。如果我手动操作,可以进入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()中看到的只是这些字符被字面地输入了。 在]e之间加上time.sleep(0.1)似乎也没有帮助。

我该如何以编程的方式输入这个转义序列呢?

1 个回答

6

最后我搞明白了。

简单来说就是:'\x1d'

这是一个特殊的字符,用来调出那个小菜单。我是通过 curses 模块发现这个的:

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

撰写回答