通过 xbindkeys 调用无密码 sudo

通过 xbindkeys 调用无密码 sudo

我尝试设置键绑定来更改虚拟终端(VT)X,如中所述这个帖子。在终端仿真器中键入sudo chvt $(($XDG_VTNR-1))会适当地更改 VT。然而,我发现chvt只有当作为终端仿真器的命令执行时(例如,xterm -e),以提升的权限运行才有效,这是我试图规避的要求。

描述我的设置:

以下行已添加到/etc/sudoers

me    ALL=NOPASSWD:/bin/chvt

其中me的输出是whoami.我也尝试了这条线的变体(例如,me ALL=(ALL) NOPASSWD:/bin/chvtme ALL=(ALL:ALL) NOPASSWD:/bin/chvt

对于~/.xbindkeysrc,我添加了键绑定:

"sudo chvt $(($XDG_VTNR-1))"
   alt + c:113

"sudo chvt $(($XDG_VTNR+1))"
   alt + c:114

或者

"sudo chvt $(($XDG_VTNR-1))"
   m:0x8 + c:113

"sudo chvt $(($XDG_VTNR+1))"
   m:0x8 + c:114

第一个是链接帖子的作者建议的,后者是通过xbindkeys -k在我的系统上运行确定的。

键绑定失败,我xbindkeys以非守护程序模式运行进行调查。运行时按 Alt+向左或 Alt+向右xbindkeys -n会出现以下错误:

sudo: no tty present and no askpass program specified

将命令更改~/.xbindkeysrc为 会xterm -e sudo chvt ...产生一个有效的密钥绑定(但代价是打开实例xterm并提示输入密码),这证实了缺少 atty是问题所在。如何在不先调用 a 的情况下实现sudoin的调用?.xbindkeysterminal

系统详细信息:debian v9.2.、dwm v6.1、openbox v.3.6.1、xbindkeys v1.8.6、sudo v1.8.19p1

答案1

安全敏感的默认设置(或者至少放入您的发行版的默认 sudoers 中)是不允许没有 tty 的 sudo 命令,以防止应用程序中的漏洞导致权限升级。使用快捷方式运行的命令没有 tty,因此不会运行。您可以全局禁用此设置,但最好对除此命令之外的所有内容禁用它。该选项名为requiretty

Cmnd_Alias    CHVT = /bin/chvt
me            ALL = NOPASSWD: CHVT
Defaults!CHVT !requiretty

第一个!表示后面是 Cmnd_Alias,第二个!是逻辑非运算符。因此运行 chvt 可以免除 requiretty。这里不需要使用 Cmnd_Alias,但是如果您使用带有选项的命令,或者想要禁用两个命令的 requiretty,语法需要它。

注意:其他一些设置可能会取消其中一些行。因此可能需要将其放在 sudoers 的最后。看来OP也需要这样做才能让它工作,也许是因为%sudo ALL=(ALL:ALL) ALL

相关内容