Linux 中的重复伪终端

Linux 中的重复伪终端

在 Redhat 盒子上 [ Red Hat Enterprise Linux AS 版本 4 (Nahant Update 3) ]

我们经常会发现两个人被分配到同一个伪终端。例如:

$who am i
user1 pts/4        Dec 29 08:38 (localhost:13.0)
user2 pts/4        Dec 29 09:43 (199.xxx.xxx.xxx)
$who -m
user1 pts/4        Dec 29 08:38 (localhost:13.0)
user2 pts/4        Dec 29 09:43 (199.xxx.xxx.xxx)
$whoami
user2

这会导致脚本出现问题,因为“who am i”会返回两行。我知道这两个命令之间存在差异,显然我们可以更改脚本来修复该问题。但两个用户使用同一个终端返回仍然让我感到困扰。我们怀疑这可能与死会话有关。有人能解释为什么分配了两个(非唯一)pts 编号以及/或者将来如何防止这种情况发生吗?

答案1

您是否尝试过较新版本的 Red Hat?4.3 相当老旧,最新的 4.x 版本是 4.8。此外,Red Hat 5 的版本是 5.4,这是一个很大的进步。如果您想尝试较新版本,又不想购买 Red Hat,您可以尝试与 Red Hat 二进制兼容的 CentOS。

答案2

升级服务器的建议是正确的。

否则,您可以升级部分应用程序,但不能升级其他应用程序。升级哪些组件以及升级到何种程度,“留给学生练习”。

首先,您需要进行一些测试,以找出发生这种情况时人们正在使用什么终端仿真程序。是 Xterm 吗?如果是,请参阅“Red Hat Enterprise Linux 3 Update 8 发行说明” - http://mirror.centos.org/centos/3/docs/release-notes/as-amd64/RELEASE-NOTES-U8-x86_64-en.html

在那里你会发现一个针对 xterm 的错误修复,它简单地指出:“不要写重复的 utmp 条目”

所以这让我推测你应该将 xterm 升级到至少 xterm-179-6.EL3(不要问我为什么版本号是 EL3;我不知道)

希望这有帮助!
-pbr

答案3

我无法在这里重现这种行为 - 无论我做什么,utmp 都会被清理 - 但 utmp 更新是由一个辅助程序完成的utempter/usr/lib/utempter它被 xterm 调用,所以如果 xterms 由于某种原因被彻底杀死(比如虚拟内存耗尽),它可能没有机会清理。

另请注意,其中已修复一个安全漏洞http://rhn.redhat.com/errata/RHSA-2004-174.html 不过我猜测,相关用户不太可能故意利用这一点来造成故障。

看看是否可以通过在后台启动 xterm 并将其杀死而不给它机会清理 utmp 来重现该行为:

$ 谁
$ xterm &
[1] 6229
$ 谁
$ kill -9 6229
$ 谁

还有一个巫术理论:我注意到xterm有一个设置可以让 utmp 的行为更加谨慎。它通常默认启用,并通过输入以下代码禁用:

XTerm*ptyHandshake:false
~/.Xresources或系统范围内/etc/X11/Xresources/xterm。不太可能,但只是一种想法。

一种解决方法可能是说服或强迫用户使用不同的 X 终端仿真器,比如rxvt,它是一种较小的嵌入式替代品,可响应现有的 xterm 配置设置,不包括 Tektronix 4014 画线图形仿真功能,并且运行时占用的内存要少得多。

相关内容