![如何在终端文本登录提示期间显示命令的输出?](https://linux22.com/image/77848/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%BB%88%E7%AB%AF%E6%96%87%E6%9C%AC%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E6%9C%9F%E9%97%B4%E6%98%BE%E7%A4%BA%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%EF%BC%9F.png)
我有一个主要运行的无头服务器德班没有安装 xorg/图形环境。启动时它仅显示文本模式登录提示。
我想知道我怎样才能在任何用户登录之前显示命令的输出(在我的终端的登录屏幕中)?该命令的显示方式与命令一样watch
,每 2 秒左右更新一次,并且不需要交互。
注意:我知道在大多数情况下,只需在计算机上运行 SSH 会话并运行 awatch
就足够了,或者安装一个可以在浏览器中提供我所需内容的 Web 服务器会更好。然而,由于不同的原因,这两种方法在我的场景中都不实用。另外,为了纯粹满足我的好奇心,我想知道这个问题的答案。
答案1
在我的脑海里,你可以做这样的事情:
- 编写一个脚本来完成您需要的任何操作(也许只是
watch somecommand
,也许更复杂) - 创建一个用户帐户,并将该脚本设置为其登录 shell
- 调整您
getty
以自动登录该用户
这可能会导致无法正常登录;需要进行一些实验才能弄清楚这一点。
当然,显示登录时间信息的正常机制是/etc/issue
。然而,从这个角度来看,它似乎并不合适,因为 1. 没有运行任意命令并输出这些命令的机制,2. 没有持续更新输出而不是打印一次的机制。
答案2
如前所述,/etc/issue
显示在正确的位置,但它是静态消息。
你可以/etc/issue
通过强制进程偶尔重新启动来编写脚本getty
,但 2 秒的间隔会干扰登录。更实际的间隔大约是一分钟。
对于 Debian,您可能正在使用agetty
(请参阅手册页)。可以通过SIGHUP
向其发送 a 来重新启动它(如根,当然,因为getty
运行为根)。
相关阅读:
答案3
不要login
在 tty 初始化时立即运行,而是运行如下所示的脚本:
#!/bin/sh
( trap '' TTOU
while clear
do #gen your output
sleep 2
done
) & stty -icanon
dd count=1 >/dev/null 2>&1
stty icanon
exec login
...它将运行您在循环中放入的任何内容,直到至少从 tty 读取一个字节,此时login
将被调用。login
总是以控制 tty 开始HUP
,因此将输出写入终端的后台进程一旦终止就会立即终止,但直到有人按下某个键,它才会继续循环生成您希望的任何输出。即使它可以从后台将输出写入其控制 tty,但无论您的后台循环尝试做什么,它都永远不会成功读从中获取任何输入。