准备

准备

我在 Raspberry Pi 上运行 Raspbian,我希望能够在按下键盘上的某个键时运行 shell 脚本。据我所知,AutoHotkey 不适用于 Linux,否则我会在 AHK 中执行此操作。

对于熟悉 AHK 的人来说,我只想这样做:

SetWorkingDir, /scripts/
Numpad1::
Run toggle.sh
Return

Linux 的解决方案是什么?

我不使用任何桌面环境。是否可以在登录前激活此热键?如果不行,我可以保持登录状态。

答案1

我可以使用我朋友的 Raspbian(它不是最新的)。不过,我不想弄乱不属于我的设备的配置,尤其是如果它涉及键盘支持;所以以下答案基于我在 Debian 9 中的工作。我使用 Raspbian 只是为了确认所需的软件包在那里可用。Debian 和 Raspbian 之间的一些细节可能有所不同。


准备

您需要以下软件包:

  • lirc。它的常见用途是从控制器(如红外遥控器)读取数据并向各种兼容程序(如多媒体播放器)发送各种命令。它还可以通过irexec可执行文件运行任意系统命令(例如脚本),这就是你的情况。在我的 Debian 中,该lirc软件包提供了irexec.service可执行文件,但在(过时的)Raspbian 中,它似乎只提供了可执行文件,而不是服务。我将在后面的答案中解决这个问题。然后还有……
  • inputlirc,zeroconf LIRC 守护进程使用输入事件设备(如常规键盘上的按键)。我们将使用它的守护进程,而不是大型lircd.servicelirc包仍然是必需的,因为irexec我们想要使用)。
  • input-utils,用于设置事物的有用实用程序。

安装它们:

sudo apt-get install lirc inputlirc input-utils

如果您想使用特定的键盘(而不是所有可用的键盘),请找出它是哪个设备:

sudo lsinput

在我的情况下,我想要使用的设备是组合设备,它注册为/dev/input/event8/dev/input/event9。为了查看哪一个是正确的设备,我使用了

sudo input-events 9        # for /dev/input/event9

我按下了我想使用的键并观察了输出。我重复了event8。结果发现我的设备通过 传递“普通”键,event9通过 传递多媒体键event8

无法保证同一设备在将来重新启动后会获得相同的编号。不过,操作系统为 中的某些设备提供了符号链接/dev/input/by-id。检查它们:

ls -l /dev/input/by-id

这些路径不应该改变,您应该在进一步配置时选择它们。


配置

inputlircd

inputlircd是软件包中的守护进程inputlirc。我们想使用它来读取键盘。我认为大型 LIRC 守护进程并不是真正需要的,因此禁用它lircd.service似乎是个好主意。但是,有些依赖项无论如何都会运行 LIRC。重新路由它们会使这个答案过于复杂,没有意义;所以让我们保持原样。

在我的 Debian 中有/etc/init.d/inputlirc一个文件。检查后我发现它使用了来自的选项/etc/default/inputlirc。在那里设置正确的值。我的/etc/default/inputlirc现在看起来像这样:

# Options to be passed to inputlirc.
EVENTS="/dev/input/by-id/usb-1ea7_2.4GHZ_Keyboard___Mouse_Combo-event-mouse /dev/input/by-id/usb-1ea7_2.4GHZ_Keyboard___Mouse_Combo-if01-event-kbd"
OPTIONS="-m 0"

注意我在一个表单中使用了两个设备/dev/input/by-id/something,尽管监控所有连接的键盘/dev/input/input*应该是正确的(这是开箱即用的设置)。您可能想要使用-m-n/或其他选项。阅读man 8 inputlircd

保存文件后,启用并(重新)启动该服务:

systemctl enable inputlirc.service
systemctl restart inputlirc.service

并检查它是否正在运行:

systemctl status inputlirc.service

irexec.service

在我的 Debian 中,我有/lib/systemd/system/irexec.service。我朋友的 Raspbian 缺少该文件(即使lirc软件包已安装并irexec可用)。如果您需要手动创建它,这是我的 Debian 中的原始内容:

[Unit]
Documentation=man:irexec(1)
Documentation=http://lirc.org/html/configure.html
Documentation=http://lirc.org/html/configure.html#lircrc_format
Description=Handle events from IR remotes decoded by lircd(8)

[Service]
; user=lirc
; group=lirc

; Hardening opts, see systemd.exec(5).  Doesn't add much unless
; not running as root. If these are applicable or not depends on
; what commands irexec.lircrc invokes.
;
; NoNewPrivileges=true
; MemoryDenyWriteExecute=true
; PrivateTmp=true
; ProtectHome=true
; ProtectSystem=full


Type=simple
ExecStart=/usr/bin/irexec /etc/lirc/irexec.lircrc

[Install]
WantedBy=multi-user.target

该文件的所有者为root:root,其权限为644。我认为最好在 部分中添加After=inputlirc.service和。我不是依赖关系方面的专家,因此这可能不是最佳选择,或者不够。Requires=inputlirc.service[Unit]

如果你查阅man 1 irexec,你会看到/etc/lirc/irexec.lircrc上面出现的路径是配置文件。将此代码片段放入配置文件中:

begin
    prog   = irexec
    button = KEY_MUTE
    config = beep -r 5
end

并调用

systemctl restart irexec.service

使irexecstart 对静音键做出反应。beep您可以使用而不是cd /scripts/ && ./toggle.sh。现在,如果您按下该键,该工具将传递命令给sh来执行。

要了解密钥名称(例如KEY_MUTE),您可以查看inputlircd通过套接字的内容:

socat UNIX-CONNECT:/var/run/lirc/lircd STDOUT

按下要使用的键并记下输出。要使用的名称在第三列中。


笔记

  • inputlircd在我的 Debian 中,和的默认套接字irexec/var/run/lirc/lircd/run/lirc/lircd由于符号链接 ,和 是相同的/var/run -> /run)。如果您的情况是这两个工具使用不同的套接字,请让它们使用单​​个套接字,这至关重要。有多种选择,请参阅相应的手册。
  • 对于 0.9.1 之前的版本,irexec需要等待执行的程序终止。[…] 0.9.2+ 版本不需要这样做,因为无法等待命令完成。

来源
这意味着您可以并行运行脚本的多个实例,只需快速按下该键即可。如果这种情况不发生,您运行的命令或脚本本身必须检测其先前的实例并等待或终止。我会使用锁文件为此。脚本本身可能是锁文件,如下所示:

    config = cd /scripts/ && flock -w 1 ./scriptA.sh ./scriptA.sh
  • 该解决方案不会抑制所选键的“正常”操作。您可能担心如果按下该键,TTY1 上的登录输入甚至密码会变得混乱Enter。这可能会导致登录尝试。解决方法:

  • 切换到未使用的 TTY;

  • 面膜[email protected](见;不过我还没有测试过,我不知道操作系统是否不会自动切换到已使用的操作系统);

  • 运行一些自定义命令(例如这个答案,我也没有测试过)。

  • 注意相关服务运行的用户。还有ProtectHome=ProtectSystem=选项。这些(以及其他一些)将限制您的脚本可以执行的操作。如果某个文件系统已加密或卸载,则脚本将无法使用它,直到它正确安装(例如,如果您的主目录在您登录时才解密,则脚本将无法与其交互,直到您登录)。

答案2

安装xbindkeys、运行xbindkeys -k并按下按键。然后复制响应并将其粘贴到.xbindkeysrc根目录中的文件中,格式如下命令,换行,然后预先复制的密钥代码。这应该在 xbindkeys 守护程序运行时执行命令(提示 - 您可以通过将该命令添加xbindkeys到启动中来运行它)。

更多相关文档这里

我每天都使用它来通过 Thinkpad 上的 ThinkVantage 按钮启动终端 - 它也可以与其他键一起使用,例如使用 ctrl + numpad_minus 键运行自定义脚本。

相关内容