当我使用同一用户登录tty1
并tty2
启动 X 服务器会话时tty1
- 一旦我注销tty2
,X 服务器会话就会tty1
崩溃。
这似乎是一个已知的错误:
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=834270
- https://groups.google.com/forum/#!topic/linux.debian.user/2G71U8P8c3Q
正如您在错误报告中所读到的,问题在于对clear_console
in的调用~/.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
作为标准,在终端挂起时清除其显示缓冲区。
进一步阅读
- https://unix.stackexchange.com/a/375784/5132
- 格雷格·伍利奇 (2014-04-08)。 停止清理我该死的控制台。格雷格的维基百科。
- 乔纳森·德·博因·波拉德 (2015-08-22)。Debian Jessie 中的多个 tty 导致系统冻结。 [电子邮件受保护]。 debian 用户。
- https://unix.stackexchange.com/a/318297/5132
- 乔纳森·德博因·波拉德 (2018)。
console-terminal-emulator
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
console-clear
。 小吃指南。软件。 - https://unix.stackexchange.com/a/316279/5132
- 卡斯滕·嘿(2015-08-09)。zsh:请在注销时清除控制台(如果使用推荐的配置)。 Debian 错误#704968。
答案2
根据dlocate
,clear_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 供用户在通过控制台登录时默认使用来清理屏幕,那就太好了,这是常见的请求,特别是在人们不希望其他人的多用户环境中看看他们在做什么。
顺便说一句,这与恩诅咒这里:
- 红帽#815790 [RFE-隐私] 清除控制台,提到
- Debian #376841 请将clear_console添加到ncurses-bin中
前者是通过改编一个特性来解决的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 的情况下清除屏幕的唯一方法。