为什么将“脚本”重定向到 /dev/null/ 会允许“屏幕”在以其他用户身份运行?

为什么将“脚本”重定向到 /dev/null/ 会允许“屏幕”在以其他用户身份运行?

我被要求使用某个用户来运行某个长时间运行的脚本。我想使用屏幕,但收到错误消息“无法打开您的终端‘/dev/pts/4’ - 请检查。”

于是我谷歌了一下,偶然发现了一个论坛帖子,上面指示运行$ script '/dev/null/'。我照做了,然后就可以进行筛选了。

为什么这样做有效? su 做了什么,导致屏幕无法以 su 用户身份运行? 为什么将“脚本”重定向到 /dev/null 会阻止这样做? 是否使用脚本以原始用户身份将日志写入某个地方?

答案1

嗯,从技术上讲,你在这里并没有重定向任何东西。

调用script /dev/null只会script保存整个打字稿实际上,将其放入/dev/null其中意味着丢弃内容。

man script参阅详细信息和util-linux-ng实施包(misc-utils/script.c)。

这与实际无关screen。之所以有效,是因为调用script会产生副作用,即在 处为你创建一个伪终端/dev/pts/X。这样你就不必自己动手了,而且 screen 不会有权限问题——如果你su从用户A致用户,通过直接调用screen你试图抢占用户A的伪终端。除非你。这就是您看到错误消息的原因。

答案2

要直接输出到终端窗口,正在运行的程序需要能够写入控制终端。如果您使用的是 xterm 或 ssh 或其他虚拟连接(而不是实际的实时直接连接的终端),则控制终端是伪终端(后续章节)。

当您登录时,您的 pty 被设置为只有您才具有写入权限,否则其他用户可以在您的显示屏上乱涂乱画(或读取)。因此,当您 su 为另一个用户(并且该用户不是 root)时,该用户无权访问底层 pty。

但是,更复杂的 I/O(如屏幕)需要直接访问 pty 才能发挥控制整个屏幕的魔力。这时,您就会遇到运行命令的人无法正确访问控制终端的问题。

将脚本重定向到 /dev/null 会导致屏幕不会尝试写入控制终端,因此不会遇到权限问题。

相关内容