我的系统中有一个守护进程,它在一个屏幕实例内运行,所有这些都是由一个非特权用户完成的。我已将自己添加到特殊的 sudo 组,允许我从该用户运行 screen,但是当我尝试使用它时,例如
sudo -u that_user -H /usr/bin/screen -R
Run Code Online (Sandbox Code Playgroud)
我明白了这篇文章的主题。
四处挖掘我发现此消息意味着屏幕无法抓取或输出到我在调用它时实际使用的 pty。对此的常见答案是将我的 /dev/pts/N chmod 为其他人的 rw,但我记得我以某种方式设法较早地避免了这种情况。也许我错过了为 sudo 保存一些环境?
特别是我试图通过 sudo 从普通用户连接到在屏幕上运行的 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
Run Code Online (Sandbox Code Playgroud)
终于找到了实际的解决方案:
alias rtorrent="urxvt -hold -e /bin/bash -c \"chmod o+rw \\\`tty\\\` && sudo -u rtorrent -H screen -r rtorrentd\""
Run Code Online (Sandbox Code Playgroud)
由于您screen以特殊用户身份运行,因此特殊用户需要访问您的 pty。完成此操作的唯一方法是更改设备上的权限。
更好的方法是使用 screen 的多用户功能,它允许用户在不使用 sudo 的情况下连接到另一个用户的 screen 会话。这需要设置screen二进制 setuid 根:
sudo chmod u+s /usr/bin/screen
Run Code Online (Sandbox Code Playgroud)
然后创建一个新的屏幕会话,给套接字一个有意义的名称:
screen -S torrent
Run Code Online (Sandbox Code Playgroud)
在此屏幕会话中,启用多用户模式并授权其他用户:
^A: multiuser on
^A: acladd tijagi
Run Code Online (Sandbox Code Playgroud)
然后,您应该能够以自己的身份附加屏幕会话:
screen -x that_user/torrent
Run Code Online (Sandbox Code Playgroud)