世界希望您清洁屏幕。

世界希望您清洁屏幕。

当我使用同一用户登录tty1tty2启动 X 服务器会话时tty1- 一旦我注销tty2,X 服务器会话就会tty1崩溃。

这似乎是一个已知的错误:

正如您在错误报告中所读到的,问题在于对clear_consolein的调用~/.bash_logout。如果我删除该行,一切都会正常。

我的问题:

我没有注意到任何变化。 (显然,除了 X 服务器不再崩溃。)当我注销时,控制台正在被清除 - 无论我删除该行。那么,clear_console首先打电话到那里的目的是什么?

答案1

世界希望您清洁屏幕。

正如我所说https://unix.stackexchange.com/a/233855/5132事实上,在间接引用的邮件列表讨论中 ☺ …

正如 Greg Wooledge 和其他人所发现的那样,不想在注销和随后的登录之间清除虚拟终端实际上​​是逆潮流而行。自 20 世纪 70 年代以来,特权用户或老板的敏感输出在注销后仍然存在,这一直是 Unices(实际上也是其他分时远程访问操作系统)的一个安全问题,并且需要付出很大的努力才能撤消所有这些输出。人们为避免这个问题而投入的东西。正如您所观察到的,他们引入了几个重叠的机制来执行此操作。

  • 许多系统clear_console的 shell 注销脚本中都有一个标准命令。 (这本身就是有问题的,因为它不能很好地与在内核虚拟终端 #1 上运行的图形程序配合使用,并且不能与任何其他类型的终端(虚拟的或真实的)一起使用。)

    必须删除该命令。

  • 针对虚拟终端的 getty 程序(例如 )的默认设置mingetty是清除终端。 (它在登录之前执行此操作,这意味着如果 TTY 登录服务停止,终端输出可以保持不被删除。具有讽刺意味的是,此功能本来可以更好地放置在 中login,这要归功于 PAM 的必要性,它在注销时仍在运行。 )

    --noclear必须部署该选项才能禁用此功能。在 systemd 操作系统上,这涉及编写一个或多个单元文件覆盖文件、更改设置ExecStart或简单地指向[email protected]自己设计的本地单元文件。

  • systemd 提供的[email protected]模板服务单元集TTYVTDisallocate=yes指示 systemd 清除内核虚拟终端。 (这又不适用于任何其他类型的终端,甚至用户空间虚拟终端也不起作用,正如其名称所部分反映的那样。)

    这也必须再次使用覆盖或指向的不同服务模板来删除[email protected]

当然,它们并不完全重叠。 mingetty对于通过串行设备连接的真实终端没有用;clear_console奇怪的是,它是 Bourne Again shell 包的一部分,并且不会被使用 Korn、Z、Almquist、Fish、Watanabe 或其他 shell 作为用户帐户的交互式登录 shell 的人调用;并且systemdTTYVTDisallocate机制不适用于非systemd操作系统。

正如我在几年前的邮件列表讨论中所说,console_clear这是双重不必要的。自 2011 年以来,Linux 内置终端仿真器已支持3用于清除回滚缓冲区的 ED 控制序列,因此从一开始就没有必要进行具有这些有害副作用的切换虚拟终端的操作。几年前,我console-clear向 nosh 工具集添加了一个命令,该命令发出此控制序列(因此不仅可以与 Linux 内置终端仿真器一起使用,还可以通过远程连接进行工作)。如果 terminfo 这么说的话, ncursesclear命令现在也知道发出相关的控制序列。

当然,console-terminal-emulator作为标准,在终端挂起时清除其显示缓冲区。

进一步阅读

答案2

根据dlocateclear_console是 (Debian) bash 软件包的一部分。它不是上游的一部分bash来源。这包变更日志告诉你它来自何时/何地:

——马蒂亚斯·克洛泽,2006 年 3 月 23 日星期四 01:16:22 +0100

bash (3.1-3) 不稳定;紧急程度=低

...

  从 Ubuntu 合并:
  *clear_console:用于清除控制台的新帮助程序,包括
    回滚缓冲区。
  * /etc/skel/.bash_logout:再次安装并使用clear_console。
    Ubuntu#29405。关闭:#331504。

引用的错误报告给出了添加它的原因:

  • 乌班图 #29405, 2006 年 1 月“exit”之前不运行“clear”

    注销 F1-F6 终端时,即使出现下一个登录屏幕,所有现有的活动输出也会保留在屏幕上。在出现新登录之前应清除屏幕,以便其他用户不会查看私人输出。

  • Debian #331504,2005 年 10 月bash:请提供默认的 /etc/skel/.bash_logout

    如果 bash 在 /etc/skel 中提供默认的 .bash_logout 供用户在通过控制台登录时默认使用来清理屏幕,那就太好了,这是常见的请求,特别是在人们不希望其他人的多用户环境中看看他们在做什么。

顺便说一句,这与恩诅咒这里:

前者是通过改编一个特性来解决的xterm补丁 #1071999 年(针对 Linux 控制台),而后者由于许可证不兼容而毫无进展。

答案3

我认为这与隐私和安全有关。让任何人都看到你在结束的会话中所做的事情是不明智的。在我的 Debian 上,完整条目.bash_logout是:

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

$SHLVL当它是链中的第一个 shell 时,值为 1。 (您可以从 shell 启动一个新的 shell,这会增加SHLVL.)。一旦您结束第一个会话并将控制台和提示传递给任何人,控制台应该保持会话的内容无法被未经授权的人员访问,因此确实如此。

答案4

由于 init 系统中的配置,您的 tty 正在被清除。如今,大概systemd

对于 systemd 设置TTYVTDisallocate为 no。

要实现此目的,请运行systemctl edit getty@tty1 并输入以下代码

[Service]
TTYVTDisallocate=no

https://askubuntu.com/questions/58097/how-can-i-remove-the-clear-screen-before-login/781923#781923

注释指向一个较长的页面,其中还提到了可以在 sysvinit 下使用的配置:--noclear的选项getty

http://mywiki.wooledge.org/SystemdNoClear

最后,听起来好像并不是所有版本中都存在明确的功能getty(以及getty 的选项)。--noclear

作为系统管理员,您可以将控制台配置为在显示登录提示之前始终被清除。最简单的方法是使用 Mingetty 而不是 getty;您失去了对串行控制台的支持,但获得了一些功能,例如屏幕清除。

--注销后如何清除终端?2010年发布的答案。

因此,bash_logout 可能是在不切换到不同 getty 的情况下清除屏幕的唯一方法。

相关内容