这是一个有点笨拙的问题,因为我无法找到一个好的方法来描述它,但在期望中你可以做这样的事情:
interact { \001 {do_something} \003 {do_something_else} "?" { set timeout 1 expect_user { "?" {send "?"} timeout {send_user "show a menu of the things you can do"} } stty raw -echo set timeout 60 } \035 {send "^]" send "quit\r" send_user "\n" exit } }
这将创建一个交互式会话,用户可以照常开展业务,但按下键盘组合键(ctrl+ a、ctrl+ c、ctrl+ e、 ?等)时会执行操作或显示描述可能的快捷方式的文本。
我正在尝试将一些脚本更新为 python 和 pexpect,但无法确定这在 pexpect 中是否可行。我尝试使用输入过滤器,但似乎这里并不是真正“正确”的地方,或者也许我只是找不到任何实际的好例子。
@pynexj:尝试了你的脚本,但是我没有从 ctrl 命令在标准输出上得到任何东西。
16:51:16 ~/scripts $ p3 testInputFilter.py | tee testInput.txt 16:51:19 ~/scripts $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND usr 45721 0.0 0.0 109620 1876 pts/1 Ss 16:49 0:00 -ksh usr 46622 0.0 0.0 108436 1776 pts/1 S 16:51 0:00 bash usr 46734 5.5 0.0 135728 7688 pts/1 S+ 16:51 0:00 python3.6 testI usr 46735 0.0 0.0 100912 632 pts/1 S+ 16:51 0:00 tee testInput.t usr 46736 0.0 0.0 108336 1692 pts/5 Ss 16:51 0:00 /bin/bash --nor usr 46759 0.0 0.0 110236 1132 pts/5 R+ 16:51 0:00 ps u 16:51:21 ~/scripts $ ^C 16:51:42 ~/scripts $ exit 16:51:43 ~/scripts $ cat testInput.txt 16:51:19 ~/scripts $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND usr 45721 0.0 0.0 109620 1876 pts/1 Ss 16:49 0:00 -ksh usr 46622 0.0 0.0 108436 1776 pts/1 S 16:51 0:00 bash usr 46734 5.5 0.0 135728 7688 pts/1 S+ 16:51 0:00 python3.6 testI usr 46735 0.0 0.0 100912 632 pts/1 S+ 16:51 0:00 tee testInput.t usr 46736 0.0 0.0 108336 1692 pts/5 Ss 16:51 0:00 /bin/bash --nor usr 46759 0.0 0.0 110236 1132 pts/5 R+ 16:51 0:00 ps u 16:51:21 ~/scripts $ ^C 16:51:42 ~/scripts $ exit 16:51:57 ~/scripts $
请参阅以下示例(适用于Python2和Python3):
[STEP 114] # cat foo.py import pexpect def input_filter(s): if s == b'\x03': return b'\r: r u going to kill me? press ctrl-d to exit!\r' elif s == b'\x04': return b'\r: ok, bye; exit\r' else: return s proc = pexpect.spawn('bash --norc') proc.interact(input_filter=input_filter) proc.expect(pexpect.EOF) [STEP 115] # python foo.py bash-4.4# ps <-- user input PID TTY TIME CMD 77616 pts/56 00:00:00 bash 77617 pts/56 00:00:00 ps bash-4.4# <-- press CTRL-C bash-4.4# : r u going to kill me? press ctrl-d to exit! bash-4.4# <-- press CTRL-D bash-4.4# : ok, bye; exit exit [STEP 116] #