我遇到了一个有趣的情况,一个用户的帐户被暂时删除(文书工作没有及时更新)。然而,多亏了“屏幕”的魔力,他的进程仍在运行。
我希望能够重新连接到那些旧的屏幕会话并保存一些数据。这可能吗?我有 sudo 权限,但不确定如何在这种情况下应用它们。
通常我会这样做:
chmod 777 `tty`
sudo su <user>
screen -x
但在这种情况下,用户不再存在。天真地插入旧用户 ID 不起作用(我并不真的期望它能起作用)。
这是 RedHat Enteprise Linux 5:(2.6.18-53.1.14.el5)
答案1
您不能仅仅使用相同的 UID 临时再次创建用户帐户吗?
答案2
好吧,这就是为什么应该禁用用户而不是删除用户的原因。 passwd 有内置选项可以实现这种功能(据我所知,每个集中用户管理软件都有相关设置)。
但你来这里不是为了被人吼。
用户的文件是否仍然存在,或者这些文件是否已随帐户一起被删除?Screen 使用锁定文件重新连接,如果这些文件不见了,我真的不知道如何恢复会话。
如果可能的话,请尝试 Keiran 的建议,重新创建 UID。有时这是不可行的,特别是在集中式身份验证中,其中 ID 是从其他用户信息中散列出来的,但如果可以的话,那就太好了。
假设你不能,你需要找到一种方法来接管终端。我猜你的系统上还没有配置 TTYSnoop。在这种情况下,事情会变得很棘手。
假设您的屏幕会话像我的一样向您发出 pts/# 终端,那么可能 (可能) 有机会。pt 代表伪终端,它是一种基于客户端/服务器的终端。有 pt 从属终端,即您用来输入的终端,还有 ptmaster,用于接收输入。一个 pt 主终端 (/dev/ptmx) 有许多从属终端 (/dev/pts/*)。从 ptmx 的手册页来看:
Before opening the pseudo-terminal slave, you must pass the master’s
file descriptor to grantpt(3) and unlockpt(3).
Once both the pseudo-terminal master and slave are open, the slave pro‐
vides processes with an interface that is identical to that of a real
terminal.
可能(可能!)可以使用自定义编写的程序来假设您想要假设的终端的身份(哦,见鬼,此时不妨说劫持),该程序可以方便地忽略某些安全措施,例如您想要的文件描述符的预先存在。
此时,承认失败并丢失数据可能就没那么费劲了。
答案3
您是否尝试过以 root 身份通过指定正在运行的屏幕的套接字名称来连接屏幕?(我个人还没有尝试过。)