当我以用户“paul”身份登录虚拟终端(例如 /dev/tty2)并输入“chvt 4”时,我就可以正常切换到 /dev/tty4 的虚拟终端。
当我以用户“paul”的身份输入“chvt 7”时,我就切换到了 X 窗口系统。一切正常。
然而...在 xterm 中,如果我以用户“paul”的身份输入“chvt 2”,则会收到以下错误:“无法获取指向控制台的文件描述符”
仅当我以“root”身份运行 xterm 时,chvt 命令才在 xterm 中起作用,在这种情况下,它会很乐意将我切换到虚拟终端。
我觉得这太不合理了。有人知道为什么会这样吗?
答案1
从安全角度来看,回想一下,X 的设计初衷是既可以在网络上使用,也可以在物理控制台上使用。虚拟终端则不然,因此在物理 VT 上登录与在 X 上登录是不同的安全问题。
从这个 Debian 错误报告中出现同样的错误。以下是朋友无法从 X 访问它的fgconsole
原因分析:chvt
它不仅影响 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)
由于这些都无法响应 ioctl
VT_GETSTATE
,因此 fgconsole 和朋友失败。
解决该问题的首选方法是使用sudo
。还有其他选项,但由于安全问题,它们在一般情况下不太可取——您可以决定您的情况可以容忍其中一种(强调我的):
那么,如果我不使用 sudo,就没有真正的解决方案吗?
/dev/tty0
您无法更改或的权限/dev/console
无需打开巨大的安全漏洞。设置所需程序的 suid 是一种选择,但我会远离它。sudo
更安全并且可以更详细地控制。