tty 命令仅输出当前 shell 标准输入绑定的终端设备路径(如 /dev/pts/0),不扫描系统,轻量且确定性强;who am i 从 utmp 查登录上下文,含用户、TTY 和来源;w -h | awk '{print $2}' | sort -u 可列出所有当前活跃 TTY。

tty 命令只输出当前终端,不是“所有”
执行 tty 就能立刻看到你当前 shell 所在的终端设备路径,比如 /dev/pts/0 或 /dev/tty2。它不扫描系统、不读 /var/run/utmp,只返回标准输入绑定的那个设备。所以它快、轻量、确定性强——但仅限于“你自己”。
常见误判:
- 看到 /dev/pts/0 就以为是 SSH?不一定,也可能是 gnome-terminal 或 tmux 内嵌会话。
- 看到 /dev/tty1 就以为是本地登录?对,但若图形界面占用了 tty1(如 Ubuntu 22.04 默认),你切过去看到的可能是黑屏或 login 提示,得结合 loginctl list-sessions 确认是否真有活跃用户。
who am i 和 who -m 用来验证当前登录上下文
who am i 是 who -m 的别名,它从 /var/run/utmp 中查出“触发当前 shell 的那次登录记录”,比 tty 多一层语义:它告诉你“谁、从哪、在哪条 TTY 上登进来的”。
- 输出格式为:
username ttyN date time (source),其中ttyN或pts/N就是你要的 TTY 名 - 如果
source列为空(比如本地 Ctrl+Alt+F3 登录),不加参数也能看到 TTY;若走 SSH 且 DNS 解析失败,who -i可强制显示原始 IP,避免字段错位 - 和
tty不同,它可能因 utmp 被清空或权限问题返回空 —— 这时tty仍可靠,因为它是内核级设备查询
w -h 和 awk 提取全部当前 TTY(适合脚本)
想一次性列出所有正在登录的 TTY(不只是你自己的),w 是最直接的选择。它实时读 /var/run/utmp,第二列就是 TTY 名:
w -h | awk '{print $2}' | sort -u这行命令会输出类似:
pts/0 pts/1 tty2
注意点:
- w -h 去掉表头,避免脚本误解析
- sort -u 去重,因为一个用户可能开多个窗口连同一 TTY(如多次 SSH 到同一主机)
- 不要用 users,它只输出用户名空格串,完全没 TTY 信息
- last 查的是 /var/log/wtmp,是历史记录,非当前活跃状态
区分 TTY 类型才能判断能不能操作
拿到 TTY 名后,前缀决定它是什么类型、能否安全干预:
-
/dev/pts/N→ 伪终端:SSH、telnet、gnome-terminal 等,可被sudo pkill -t pts/N安全终止 -
/dev/tty[1-6]→ 本地虚拟控制台:Ctrl+Alt+F1~F6,强杀 getty 会导致黑屏或需重启 getty@ttyX.service -
/dev/tty7及以上 → 大概率是图形会话主终端(Xorg/Wayland),踢掉等于退出桌面,慎用 -
/dev/ttyS0→ 串口终端,通常连硬件设备,不是人登录的,一般不涉及“踢人”场景
真正容易被忽略的是:很多运维脚本直接用 ps -t 查进程关联的 TTY,但守护进程(如 sshd、systemd)的 TTY 字段显示为 ?,它们不归属任何用户会话 —— 别拿这个当登录列表依据。


















