我的系统中有一个守护进程,它在屏幕实例内部运行,所有这一切都是由非特权用户完成的。我已将自己添加到特殊 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'