如何确定 bash 脚本不是在远程终端会话中运行在“控制台”上?

Sch*_*chi 0 bash console

如何确定 bash 脚本不是在远程终端会话中运行在“控制台”上?我认为有什么方法可以确定脚本是否在 /dev/console 上运行?或者我在咆哮错误的(二叉)树?

tel*_*coM 6

这听起来像是一个可能的XY 问题。

一个旧的 Unix 命令tty可以告诉你你的终端在哪个设备上。所以像这样的事情可能会做你要问的:

if [ $(tty) = "/dev/console" ]; then
    echo "Yes, I am on the console."
else
    echo "No, I am not on the console."
fi
Run Code Online (Sandbox Code Playgroud)

但是,在 Linux 虚拟控制台中的登录会话上运行的程序可能会看到/dev/tty1或类似的内容。如果使用串行控制台,您可能会看到/dev/ttyS0或其他串行端口设备。您可能会看到文字的唯一时间/dev/console可能是在紧急外壳/单用户模式下运行时。了解哪些设备可能是有效的控制台并非易事;这就是为什么/etc/securetty存在并且可由系统管理员配置的部分原因。

(如果您选择拒绝串行端口,某个地方的系统管理员试图使用 LAN 串行连接来修复非常远程的系统可能会讨厌您。)

如果一个进程或脚本作为systemd服务运行,它可能根本没有传统意义上的 TTY;相反,它的标准输出和标准错误将被插入到systemd的日志工具中,它可能会或可能不会在启动时将其传递到控制台,具体取决于服务的配置方式。

请编辑您的问题以说明您为什么想知道您是否在“控制台”上,这样我们就可以尝试找到一种方法,在适合您实际需要的意义上获得您的问题的答案。