如何检查我当前正在使用的tty?

我们的系统中有7个终端可以使用。其中tty7是基于图形用户界面的。
我如何检查我当前正在使用哪个tty

为什么你在评论中声称这是一个“pts”?这与你在这里提问的完全不同。GUI中的会话并不是tty。 - Rinzwind
2我对这个概念感到困惑,所以 - luv.preet
1相关链接:https://unix.stackexchange.com/questions/77796/how-to-get-the-current-terminal-name - Ciro Santilli OurBigBook.com
9个回答

有几种方法可以找到这个信息。我会选择使用"who am i"(而不是"who")命令:
$ who am i
ravexina    tty2        2017-04-10 11:19 (:0)

当我在图形终端中时,它会返回类似以下的内容:
ravexina    pts/0        2017-04-10 1:19 (:0)

在使用图形终端的ssh会话中,结果是相同的,但是代替(:0)的是我的机器IP(192.168.x.x)。其他命令如w、who、pgrep、ps等也很有帮助。
例如,要找出我的图形界面在哪个tty上运行:
ps $(pgrep Xorg)

在我的情况下,因为我不使用任何像gdm或slim这样的显示管理器,所以会产生以下结果:
 PID  TTY      STAT   TIME COMMAND
 1693 tty1     Sl     0:05 /usr/lib/xorg/Xorg

8+1,尽管在mate-terminal中执行who am i没有返回任何结果,而执行whoami返回zanna,(当执行who时返回所有会话(我记得有一个相关的问题(被证明无法回答)我们注意到不同的模拟器从who输出不同的结果)。 - Zanna
图形界面始终会使用tty7,因为只有它提供图形支持。 - luv.preet
@luv.preet 不是的,举个例子,我的图形用户界面正在tty1下运行 ;) - Ravexina
1@Zanna 我自己也遇到过这种情况,但我认为值得一提。 - Ravexina
1无论如何,“我是谁”在虚拟终端中总是能正常工作的,而且pgrep非常聪明(你可能想使用$()语法来代替命令子 - 反引号在Markdown中有点令人困惑),所以你的回答非常好,不应该被那个给你投反对票的人这么做... - Zanna
1@Zanna 改成了 $() ;) - Ravexina
你能提供一些资源让我更清晰地理解tty和pts的概念吗?我觉得我已经把自己搞糊涂了。 - luv.preet
1@luv.preet 这超出了你的问题范围,但是可以参考pts和tty之间的区别 :) - 这个帖子是一个重复的帖子,其中有一个很棒的答案。 - Zanna
@luv.preet 所有tty都提供“图形支持”,就像“这不是它们的工作一样”,只有终端0到6默认运行有getty(登录提示符)。最近的桌面环境都使用(KMS +)基于DRM的图形输出,与终端没有任何关联;Xorg、Wayland和类似的系统将它们仅视为座位,以保持范式一致性。在tty7+上运行图形界面只是一种约定。 - ElementW
1也是“妈妈喜欢的人” - Tejas Kale
我是谁。而且在 rxvt-unicode 上也无法工作 :(。 - pevik
在我的情况下,需要使用 ps $(pgrep X)(而不是 Xorg)。 - pevik
这个似乎比必要的更复杂。tty命令似乎是你真正需要的全部。而且who am i对我来说根本不起作用。 - Seamus

使用 tty 命令。
如果我没记错的话,这是参考资料:
/dev/tty1 - tty1
/dev/tty2 - tty2
/dev/tty3 - tty3
/dev/tty4 - tty4
/dev/tty5 - tty5
/dev/tty6 - tty6

它显示的是pts/18。 - luv.preet
这个进程可能在一个tty中运行,是吗?我怎么知道呢? - luv.preet
7@luv.preet 那是你的终端。请参考"pts和tty之间的区别" - Chai T. Rex
6pts 表示您是通过图形用户界面(GUI)或通过SSH使用终端。 - lithium_js
好的,那么我该如何使用tty呢?如果我按下CTRL + ALT + F1,我只能看到一片黑屏,什么都做不了。 - luv.preet
3你需要为此提出一个新问题。 - Chai T. Rex
3一个 pts 是 tty 的一种,从后者的广义意义上来说。(“p”代表“伪”:它是一个伪终端,在更严格区分“tty”的意义上)这就是为什么 tty 命令会报告一个 pts。 - Monty Harder

让我们退一步,从混淆的概念开始:什么是tty?最初,tty是teletype的缩写,后来变成了glass teletype,又演变成了任何终端或连接到终端的东西,具体来说就是串口(这些仍然存在,最常见的是/dev/ttyS0、/dev/ttyUSB0,有时也有/dev/ttyacm0)。然后出现了伪终端和虚拟终端。老的Unix用户熟悉伪终端,它们用于远程终端(ssh和telnet)、虚拟终端(xterm等)和终端复用器(screen和tmux)。伪终端在不同的时间有过各种命名方案,但当前的命名方案使用类似/dev/pts/0的名称。另一方面,虚拟终端与虚拟控制台相关联,特别是当您使用Ctrl+Alt+功能键时,您会切换虚拟控制台,每个虚拟控制台都与一个虚拟终端配对。最著名的虚拟终端是/dev/tty7,通常用于图形会话(因为前六个通常是文本登录),tty7并没有什么特别之处,您可以在任何虚拟控制台上运行X服务器(尽管在/dev/tty1上运行X服务器非常困难,因为内核将其用于引导日志记录,但我已经做过),您可以在任何虚拟终端上进行文本登录,包括tty7(尽管需要进行init配置,并且systemd的动态分配会让事情变得有趣,切换到tty13及更高版本可能需要更改键盘映射)。
所以如果你需要找到你的伪终端(或者在使用文本模式时的虚拟终端),有各种解决方案,比如who am ips ax|grep $$。这相对容易做到,因为有多种方法可以找出伪终端,大多数情况下伪终端在标准输入输出上打开,即使IO被重定向也有其他方法可行。这样做的好处是,在使用串口和虚拟终端时,无论你是否使用图形终端模拟器或终端复用器,它都能正确运行。
但是,如果你想要识别虚拟控制台怎么办呢?对于交互式情况,sudo fgconsole可能会有用。或者像我一样,直接遍历控制台,因为切换通常足够快速。我不知道在非交互或非前台情况下可靠地工作的编程方法。
让我们看一个例子,这个例子肯定无法可靠地回答虚拟控制台的问题。我坐在面前的电脑(alpha)上有一个运行在tty2(:1)上的X服务器,我打开了三个窗口,两个xterms和一个vncviewer(连接到bravo:2)。一个xterm正在运行screen,另一个正在运行ssh charley。Screen有两个窗口打开,ssh delta和who(who在第二列正确识别伪终端,并在第五列提供提示(:1:S0),告诉我们伪终端连接到第一个screen会话,该会话连接到第二个X服务器,但不提供任何虚拟控制台信息)。在任何一个ssh会话上运行who都会给出提示(alpha),它标识了ssh会话来自的机器,对于远程会话来说相当好。虽然关于连接到伪终端的信息很少(几乎没有虚拟控制台甚至远程终端信息可用),但至少可以确定远程主机。关于screen的信息可能是错误的,因为screen会话是可分离的,而vnc根本不提供有用的信息,因为vnc会话和本地会话之间唯一的区别就是显示编号。在许多情况下,你可以假设:0在tty7上,但并不总是如此,而且对于我来说从来没有这样,因为bravo根本没有显卡,:0是一个vnc会话(这让who感到困惑,因为它认为它是本地控制台),而且没有一台机器使用tty7作为图形会话,因为我(不仅仅是为了违抗)将日志转储到tty7(还有tty5、tty6和tty8),将图形会话放在其他地方。但是等等,screen也可以作为终端程序,允许您通过串行电缆建立会话。当运行who时,这样的会话会报告什么呢?除了串口之外,无论是通过vnc、xterm、ssh、screen和usb串行适配器同时连接,还是连接到我的televideo,都没有任何东西。

我很感激这些信息。谢谢你。 - TheGeeko61

当您登录到tty时,它会自动显示您正在使用的tty在第一行。
如果按下键盘组合Ctrl+Alt+F3只显示黑屏,正如你在评论中所写的那样,有一种替代方法可以在启动计算机时访问根终端而无需按下Ctrl+Alt+F3来显示tty。
  • 在计算机启动时,出现主板/计算机制造商标志闪屏后,立即按住Shift键(如果看到Ubuntu标志,说明您错过了进入GRUB菜单的时机)。对于UEFI,请按Esc键(可能需要按多次)以进入GRUB菜单。有时,制造商的闪屏是Windows引导加载程序的一部分,因此当您开机时,它会直接进入GRUB屏幕,无需按下Shift

  • 从第一个紫色GNU GRUB屏幕上,使用↑和↓键选择Advanced options for Ubuntu,然后按Enter。然后会出现另一个紫色GNU GRUB菜单,其中列出了内核选项的列表。

    GNU GRUB menu

  • 使用向下箭头键滚动到顶部第二个条目(其描述中带有recovery mode),然后按Enter

    现在您应该能看到这个恢复菜单:

    recovery menu

  • 使用箭头键向下滚动到root,然后按Enter

    现在您应该能看到一个类似于以下内容的根提示符:

     root@ubuntu:~#
    
  • 此时,您应该具有只读文件系统。您需要以写权限重新挂载它:

     mount -o rw,remount /  
    

    现在您可以像在终端中一样运行命令。


  • 这是否总是打开tty1? - luv.preet
    不,它不会打开任何tty。相反,它会将你在硬盘上安装的Ubuntu的根文件系统挂载为一个具有写权限的交互式shell,使你能够在其上运行命令。 - karel

    我猜你对其他答案提供的内容不感兴趣。 运行sudo fgconsole来查找当前活动的真实tty。

    @karel 很容易想象在你错过当前的TTY公告的情况下。例如,你的bash配置文件清除了屏幕。我提供了一个可以随时使用的命令,不仅仅是在登录后立即使用。关于Ctrl+Alt+F1无法工作的问题 - 有一个快速解决方法:使用chvt或openvt。 - marian adam
    顺便说一句,用sudo来运行。这就是你遇到错误的原因。 - marian adam

    使用命令tty,在Linux和macOS上都可以工作,并提供一个非常简单的输出结果,只显示你所在的tty的名称。
    示例:
    $ tty
    /dev/pts/0
    

    很容易编写脚本或将其包含在提示中,例如:
    $ PS1='`tty`: '
    /dev/pts/0: _
    

    这样你就能始终知道自己在哪个航站楼了。

    除了图形用户界面(GUI)外,在这种情况下你会得到一个pts,这也显示了期望的输出。
    ls -l `tty` | awk '{print $10}'
    

    这相当于之前的答案:
    tty
    

    最简单的方法:
    readlink /proc/self/fd/0
    

    虽然不是最可靠的方法,但在运行bash命令exec < /dev/null之后它将无法工作。 - darw

    这么多冗长的回答。
    简单的答案是: user@host:~$ /usr/bin/tty

    批评其他答案是一回事,但如果你没有仔细阅读它们以至于没有注意到第二高的答案是“tty”,那就完全不同了。如果你读了一些答案,你会看到伪终端和tty之间的细微差别,这正是导致提问者困惑的原因。 - Oli