在 ssh 终端上监听击键

listen to keystrokes on an ssh terminal

我有一个 Python 脚本,它侦听向下箭头和向上箭头键,并通过在某些选项之间移动光标来做出反应。我使用 pynput 实现了这一点。它在我的机器上工作正常,但是当我尝试通过 SSH 在我的 Raspberry Pi 上 运行 它时,它不起作用。这是我在终端上看到的:

我按了两次向下箭头,因此出现双 ^[[B,并且 x 光标应该移动到最后一个方括号。

我看过 this issue,这让我认为 pynput 不适合我的任务。有什么解决方法吗?

pynput 模块监控 Linux 输入子系统,它用于连接到本地计算机的输入设备(键盘、游戏杆、鼠标等)。通过 ssh 连接接收到的击键不由输入子系统处理,因为它们不是来自输入设备——它们只是来自网络连接的数据。

而不是依赖于 pynput,您的代码应该只监控击键的标准输入。这在 运行 本地和 运行 通过 ssh 连接时都有效。

棘手的部分是,正如您在问题中所示,向下箭头等光标移动键会生成多字符转义序列。幸运的是,curses 模块会为您处理大部分工作;看看 this example code:

#!/usr/bin/python

import curses

# get the curses screen window
screen = curses.initscr()

# turn off input echoing
curses.noecho()

# respond to keys immediately (don't wait for enter)
curses.cbreak()

# map arrow keys to special values
screen.keypad(True)

try:
    while True:
        char = screen.getch()
        if char == ord('q'):
            break
        elif char == curses.KEY_RIGHT:
            # print doesn't work with curses, use addstr instead
            screen.addstr(0, 0, 'right')
        elif char == curses.KEY_LEFT:
            screen.addstr(0, 0, 'left ')
        elif char == curses.KEY_UP:
            screen.addstr(0, 0, 'up   ')
        elif char == curses.KEY_DOWN:
            screen.addstr(0, 0, 'down ')
finally:
    # shut down cleanly
    curses.nocbreak()
    screen.keypad(0)
    curses.echo()
    curses.endwin()

如果您的唯一目标是注册按键,sshkeyboard 库可能是比 curses 库更好的选择,因为它更易于使用。它无法处理要显示的绘图。

正在安装:

pip install sshkeyboard

对箭头的反应:

from sshkeyboard import listen_keyboard

def press(key):
    if key == "up":
        print("up pressed")
    elif key == "down":
        print("down pressed")
    elif key == "left":
        print("left pressed")
    elif key == "right":
        print("right pressed")

listen_keyboard(on_press=press)