Linux下如何通过Python脚本向Telnet进程模拟按键(如向上箭头)
解决Telnet会话中通过FIFO发送特殊按键的问题
问题根源
你当前用FIFO给Telnet发命令的方式,只能传递普通字符串,但向上箭头这类特殊按键对应的是ANSI终端转义序列(比如向上箭头是\x1b[A),而非普通文本。另外,pyautogui和xdotool是模拟X11窗口的按键输入,它们的目标是当前活动终端窗口,而你的Telnet进程标准输入绑定到了FIFO,所以这两个工具的输入无法传递到Telnet进程。
可行解决方法
1. 直接向FIFO发送转义序列
Telnet接收的是原始字节流,你可以直接把特殊按键对应的转义序列写入FIFO:
- 用bash命令发送:
printf "\x1b[A" > my.fifo
- Python脚本中发送(注意用二进制模式写入,避免编码转换):
with open('my.fifo', 'wb') as fifo: # 向上箭头的转义序列 fifo.write(b'\x1b[A') # 如果需要触发执行,加上回车 fifo.write(b'\r')
2. 使用expect工具控制交互式会话
expect是专门处理交互式命令行程序的工具,比FIFO更可靠,能直接管理Telnet的输入输出:
创建一个telnet_control.exp脚本:
#!/usr/bin/expect # 启动Telnet会话 spawn telnet 182.23.45.12 10000 # 把输出记录到log.txt log_file -a log.txt # 发送普通命令 send "your_command_here\r" # 发送向上箭头 send "\x1b[A\r" # 等待会话结束,或者根据需要添加expect匹配逻辑 expect eof
给脚本加执行权限后运行:
chmod +x telnet_control.exp ./telnet_control.exp
3. 用script创建伪终端环境
原来的FIFO管道没有模拟真实终端(pty),Telnet可能会忽略转义序列。用script创建伪终端后再运行Telnet,就能正常处理特殊按键:
mkfifo my.fifo # -q 静默模式,-c 指定要运行的命令,输出直接写入log.txt script -q -c "telnet 182.23.45.12 10000" log.txt < my.fifo &
之后再用printf发送转义序列到FIFO,就能被Telnet正确识别:
printf "\x1b[A\r" > my.fifo
内容的提问来源于stack exchange,提问作者Anubhav Rai
相关产品推荐
相关产品推荐

