为什么 chvt 作为普通用户在虚拟终端上可以正常工作,但在 X 下却不能?

pbr*_*pbr 9 linux security

当我在虚拟终端(例如 /dev/tty2)上以用户“paul”登录并输入“chvt 4”时,我会切换到 /dev/tty4 的虚拟终端就好了。

当我以用户“paul”的身份输入“chvt 7”时,我会切换到 X 窗口系统。正好。

但是...在 xterm 中,如果我以用户“paul”的身份键入“chvt 2”,则会收到以下错误:“无法获取引用控制台的文件描述符”

chvt 命令仅在我以“root”身份运行时才在 xterm 中起作用,在这种情况下,很高兴将我切换到虚拟终端。

这对我来说似乎很破碎。有谁知道为什么会这样?

qua*_*ote 13

从安全的角度来看,回想一下 X 旨在通过网络以及在物理控制台上使用。虚拟终端不是,所以在物理 VT 上的登录是与 X 不同的安全野兽。

来自这个 Debian 错误报告,关于fgconsole. 以下是为什么chvt和朋友无法从 X 访问它的详细信息:

它不仅会影响 fgconsole,还会影响chvt,openvt以及任何其他试图获取控制台文件描述符的 kbd 实用程序。这些程序通过尝试打开/ioctl 这些文件(按此顺序)来完成它们的工作

/proc/self/fd/0         (is a pseudo tty in your case)
/dev/tty                (also PTY)
/dev/tty0               (only accessible to root)
/dev/vc/0               (doesn’t exist nowadays)
/dev/console            (root)
std{in,out,err}         (PTY)
Run Code Online (Sandbox Code Playgroud)

由于这些都无法响应VT_GETSTATEioctl,fgconsole 和朋友都失败了。

该问题的首选解决方案是使用sudo. 还有其他选择,但由于安全问题,它们在一般情况下不太可取——您可以决定您的情况可以容忍其中一个(强调我的):

所以没有真正的解决方案,如果我不使用 sudo?

您无法更改/dev/tty0/dev/console 不打开一个巨大的安全漏洞的权限。设置所需的程序 suid 是一种选择,但我会远离它。 sudo更安全,可以更详细地控制。