我尝试设置键绑定来更改虚拟终端(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/chvt
和me 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 的情况下实现sudo
in的调用?.xbindkeys
terminal
系统详细信息: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