我在 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.service
(lirc
包仍然是必需的,因为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
使irexec
start 对静音键做出反应。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 键运行自定义脚本。