GNU 屏幕:“无法打开您的终端‘/dev/pts/3’ - 请检查”

GNU 屏幕:“无法打开您的终端‘/dev/pts/3’ - 请检查”

我的系统中有一个守护进程,它在屏幕实例内部运行,所有这一切都是由非特权用户完成的。我已将自己添加到特殊 sudo 组,允许我以该用户身份运行屏幕,但当我尝试使用它时,例如

sudo -u that_user -H /usr/bin/screen -R

我了解这篇文章的主题。

仔细研究后,我发现此消息意味着 screen 无法抓取或输出到我在调用它时实际使用的 pty。对此的常见答案是将我的 /dev/pts/N chmod 为其他人的 rw,但我记得我之前设法避免了这种情况。也许我忘了为 sudo 保存一些环境?

具体来说,我正尝试通过 sudo 从普通用户连接到在 screen 中运行的 rtorrent 守护程序,操作系统是 Gentoo amd64。以下是从 rc 脚本调用 screen 的方式:

    start-stop-daemon \
        --start \
        --make-pidfile \
        --pidfile /var/run/rtorrentd.pid \
        --background \
        --user $USER \
        --env HOME="${PWHOME:-/home/$USER}" \
        --name rtorrent \
        --exec /usr/bin/screen -- -D -m -S rtorrentd /usr/bin/rtorrent

最终得出了实际的解决方案:

alias rtorrent="urxvt -hold -e /bin/bash -c \"chmod o+rw \\\`tty\\\` && sudo -u rtorrent -H screen -r rtorrentd\""

答案1

由于您以特殊用户身份运行screen,因此特殊用户需要访问您的 pty。实现此目的的唯一方法是更改​​设备上的权限。

更好的方法是使用 screen 的多用户功能,该功能允许用户无需使用 sudo 即可连接到另一个用户的 screen 会话。这需要设置screen二进制 setuid root:

sudo chmod u+s /usr/bin/screen

然后创建一个新的屏幕会话,并为套接字赋予一个有意义的名称:

screen -S torrent

在此屏幕会话中,启用多用户模式并授权其他用户:

^A: multiuser on
^A: acladd tijagi

然后您应该能够以自己的身份附加屏幕会话:

screen -x that_user/torrent

答案2

使用 sudo 时终端设备的所有权不会改变,但改变其权限实际上并不是唯一的解决方案(但不是一个很好的解决方案,因为它打开了一个安全漏洞)。

常见的方法是启动“脚本”会话(但不保存输出,而是将其发送到垃圾箱),这种方法之所以有效是因为它使用了另一个终端设备。

sudo -su USER script -c bash /dev/null
# new terminal with sufficient permissions for screen
screen -R

或者全部用一个命令,例如作为您的别名.bashrc

alias user-screen-attach='sudo -su USER script -c "screen -x" /dev/null'

相关内容