Python发送控件+ Q然后控制+ A(特殊键)

时间:2016-03-24 17:04:51

标签: python paramiko

我需要发送一些特殊的击键,并且不确定如何做到这一点。

我需要发送 Ctrl + Q ,然后将 Ctrl + A 发送到终端(I&#39 ;我使用Paramiko)。

我试过了

shell = client.invoke_shell()

shell.send(chr(10))
time.sleep(5)
shell.send(chr(13))

shell.send('\x11')
shell.send('\x01')

print 'i tried'

我可以看到两个回报成功进入,但没有,它没有退出picocom (还要注意我有错误的方法,它期待ctrl + a,然后ctrl + q)

如果它有助于这是设备 http://www.cisco.com/c/en/us/td/docs/routers/access/interfaces/eesm/software/configuration/guide/4451_config.html#pgfId-1069760

正如您在第2步所见

Step 2 Exit the session from the switch, press Ctrl-a and Ctrl-q from your keyboard:

Switch# <type ^a^q>
Thanks for using picocom
Router#

更新:

我试过\ x01 \ x16 \ x11 \ n但是这会返回

Switch#
Switch#
*** baud: 9600
*** flow: none
*** parity: none
*** databits: 8
*** dtr: down

Switch#

这看起来可能是另一个特殊命令?

3 个答案:

答案 0 :(得分:5)

正如假设:也许伪终端会有所帮助

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(...)
channel = сlient.get_transport().open_session()
channel.get_pty()
channel.settimeout(5)
channel.exec_command('\x11\x01') 

答案 1 :(得分:5)

这对我来说非常合适,完全符合我的期望。上面的代码中显然有一些部分缺失,所以这需要一点翼。

import sys
import time
import getpass
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('127.0.0.1',
            username='apsuser',
            password=getpass.getpass('Password: '))
shell = ssh.invoke_shell()
shell.settimeout(0.25)

shell.send('picocom /dev/ttyS0\n')
time.sleep(2)
sys.stdout.buffer.write(shell.recv(10000))
sys.stdout.buffer.flush()

shell.send('\x01')
shell.send('\x11')

time.sleep(2)
sys.stdout.buffer.write(shell.recv(10000))
sys.stdout.buffer.flush()
print()
time.sleep(2)

结果是:

Password: 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Apr 14 19:55:57 2016 from 127.0.0.1
picocom /dev/ttyS0
apsuser@Steve-Laptop:~$ picocom /dev/ttyS0
picocom v1.7

port is        : /dev/ttyS0
flowcontrol    : none
baudrate is    : 9600
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Terminal ready

Thanks for using picocom
apsuser@Steve-Laptop:~$ 

那么我的代码没有做什么呢?

答案 2 :(得分:4)

Ctrl +键实际上是一个用户友好的&#34;输入ASCII控制字符的方法。这是通过从输入密钥的ASCII码中减去64来完成的(在适用的情况下取大写字母)。例如,组合 Ctrl + H 等同于输入退格(H具有代码72,72-64=8,退格字符)。 This Wikipedia page列出与其键组合关联的ASCII控制字符,因此 Ctrl + A Ctrl + Q 相当于通过paramiko频道发送字符串"\x01\x11"

channel = client.invoke_shell()
channel.send('\x01\x11')

更新

当我按 Ctrl + A Ctrl + Q 时,要检查实际传输的内容我设计了一个小测试程序:

# decode.py
import sys

while True:
    inp = sys.stdin.read(1)
    if len(inp) == 0:
        break
    print ord(inp[0])

如果我现在通过ssh localhost python decode.py拨打此电话并输入 Ctrl + A Ctrl + V Ctrl + Q (我必须执行 Ctrl + V ,因为 Ctrl + Q 被我的本地shell解释为XON而没有传递给另一方),然后输入 Ctrl + D 要关闭连接,我会根据预期获得11710,或'\x01\x11\n'

我基本上通过执行printf '\x01\x11\n' | ssh localhost python decode.py获得相同的结果。但是,如果我通过printf '\x01\x11\n' | ssh -tt localhost python decode.py在远程端分配pty,则\x11会被远程pty拦截而不会传递到正在运行的脚本(我得到1,{{ 1}}作为输出)。在这种情况下,它有助于在 Ctrl + Q Ctrl + V 10) >指示pty传递下一个字符 V erbatim。 按预期\x16输出printf '\x01\x16\x11\n' | ssh -tt localhost python decode.py117