我被要求使用某个用户来运行某个长时间运行的脚本。我想使用屏幕,但收到错误消息“无法打开您的终端‘/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 会导致屏幕不会尝试写入控制终端,因此不会遇到权限问题。