在 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)
我有一个 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)