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

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

如何确定 bash 脚本是在“控制台”上运行而不是在远程终端会话中运行?我认为有某种方法可以确定脚本是否在 /dev/console 上运行?或者我是在吠叫错误的(二元)树吗?

答案1

这听起来像是一个可能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

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

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

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

请编辑您的问题以指定为什么您想知道您是否在“控制台”上,因此我们可以尝试找到一种适合您实际需要的方法来获得您问题的答案。

答案2

如果运行ps axu,请在 TTY 列中查找该进程使用的根“控制台”。

每个进程都有一个父进程,直到根 init 进程

答案3

使用 探索两种环境中diff的结果。是要检查的一项。env | sort$DISPLAY

另外,请阅读man isatty.

相关内容