GNU屏幕:'无法打开您的terminal'/ dev / pts / 3' – 请检查'

在我的系统中有一个守护进程,它在一个屏幕实例内部运行,而所有这些都是从一个没有驱动的用户完成的。 我已经添加到特殊的sudo组,允许我从这个用户运行屏幕,但是当我尝试使用它,例如

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

我得到这个职位的主题。

挖掘周围我发现这个消息意味着屏幕不能抓取或输出到我实际使用时调用它的pty。 对此的共同答案是chmod我的/ dev / pts / N为rw为其他人,但我记得我设法避免这个更早。 也许我错过了为sudo保存一些环境?

特别是我试图通过sudo连接到普通用户在屏幕上运行的rtorrent守护进程,OS是Gentoo amd64。 以下是从rc脚本中调用屏幕的方法:

  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 

最后解决了实际的解决scheme:

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

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

更好的方法是使用屏幕的多用户function,它允许用户连接到另一个用户的屏幕会话,而不使用sudo。 这需要设置screen二进制setuid根:

 sudo chmod u+s /usr/bin/screen 

然后创build一个新的屏幕会话,给套接字一个有意义的名字:

 screen -S torrent 

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

 ^A: multiuser on ^A: acladd tijagi 

然后,您应该能够自己附加屏幕会话:

 screen -x that_user/torrent 

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

常用的方法是启动一个“脚本”会话(但不保存输出,将其发送到垃圾箱),这是因为它使用另一个terminal设备。

 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'