广播消息不会出现在 gnome 终端上,但会出现在 xterm 上

广播消息不会出现在 gnome 终端上,但会出现在 xterm 上

我很好奇广播消息的行为

$ sudo wall myfile

来自的消息myfile出现在所有设备上(我可以通过按+ +/dev/ttyN切换到的设备),它也出现在我打开的窗口上,但它不会出现在(实际上我使用 Linux Mint 和 MATE,所以它是,但它是) 的叉子。CtrlAltfNxtermgnome-terminalmate-terminalgnome-terminal

tmux如果我在以下位置运行,还有一个有趣的注意事项xterm:我预计该消息会出现在正在运行的所有终端会话上tmux(在所有窗口上以及每个窗口的每个窗格中),但实际上该消息仅出现在当前光标位置窗户xterm

如果我通过调用检查当前控制终端tty,它会报告 tmux 中不同窗口的不同终端:比如说,我/dev/pts/11在一个 tmux 窗口和/dev/pts/12另一个窗口中都有。但是,广播消息对于每个xterm窗口仅出现一次,而不是对于在 中打开的每个终端会话出现一次tmux

在我看来,终端模拟器在分配伪终端时,需要在某个地方“注册”它以使其能够接收广播消息,因此,xterm它会这样做,但mate-terminaltmux不会。但这听起来很奇怪,因为伪终端是由内核分配的,因此,它应该在需要的任何地方自动“注册”。

如果有人解释它是如何工作的以及为什么这种行为是这样的(看起来很奇怪),我会很高兴。

答案1

列出的终端暗示该行为在 Linux 中出现:线索位于 的手册页中wall索拉里斯例如不同):

wall在当前所有终端的终端上显示一条消息、一个文件的内容或其他标准输入登录用户

某些会话,例如wdm,在开始时有乌姆普(5) ut_typedata 中的 ':' 字符将无法从 中获取消息wall。这样做是为了避免写入错误。

wall使用utmp数据,查找正在使用的终端(即登录的用户),并写入关联的设备。输出中的每一行都w显示一个(可能的)终端,由终端记录在 utmp 文件中。例如,我通过 ssh 连接到服务器并运行屏幕,同时登录到控制台。为了完整起见,我使用-ls(login-shell) 选项运行 xterm。这是输出w

$ w
 19:53:15 up  4:08,  5 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
tom      tty2                      19:48    5:11   0.04s  0.02s -tcsh
tom      pts/0    michener:S.0     15:51   13:18   0.35s  0.24s ssh -X thomas@b
tom      pts/2    michener:S.1     16:34    2.00s  0.14s  0.00s sh -c w
tom      pts/4    michener:S.3     15:52    3:59m  0.12s  0.00s /bin/sh /users/
tom      pts/3    localhost:10.0   19:53    7.00s  0.03s  0.03s -tcsh

并对wall每个TTY设备进行写入操作。

但是,如果终端不是写入 utmp 文件,它不会被列出 - 并且wall会忽略它。

现在,某些程序可能已编译该功能,但缺乏更改它的权限。这就是为什么某些程序setgid在“utmp”组中运行的原因。其他程序(例如 xterm — 或 gnome-terminal)可能会使用代表其更新 utmp 的外部程序。

对于 gnome-terminal,该功能已被弃用,因为 gnome 开发人员的心态是:(a) 用户在本地计算机上运行,​​其中gdm处理登录,并且 (b) 因此登录 shell 和非登录 shell 之间没有什么值得担心的区别。这产生了一些有趣的错误报告:

答案2

在 上urxvt,您必须发出

chown root.utmp /usr/bin/urxvt
chmod g+s /usr/bin/urxvt

然后它开始工作。

我不明白为什么,只是复制(并测试)自http://permalink.gmane.org/gmane.comp.terminal-emulators.rxvt-unicode.general/1484

相关内容