Rav*_*ina 43
有几种方法可以找出这一点。我会使用who am i
(not who
) 命令:
$ who am i
ravexina tty2 2017-04-10 11:19 (:0)
Run Code Online (Sandbox Code Playgroud)
当我在图形终端中时,它会返回如下内容:
ravexina pts/0 2017-04-10 1:19 (:0)
Run Code Online (Sandbox Code Playgroud)
在使用图形终端的 ssh 会话下,结果是相同的,但不是 (:0),而是我的机器 IP (192.168.xx)。像其他的命令w
,who
,pgrep
,ps
,等是也有帮助。
例如,找出tty
我的图形界面正在运行的位置:
ps $(pgrep Xorg)
Run Code Online (Sandbox Code Playgroud)
在我的情况下,因为我不使用任何像 gdm 或 slim 这样的显示管理器,它会产生:
PID TTY STAT TIME COMMAND
1693 tty1 Sl 0:05 /usr/lib/xorg/Xorg
Run Code Online (Sandbox Code Playgroud)
lit*_*_js 25
使用tty
命令。
如果我是对的,这是参考:
/dev/tty1 - tty1
/dev/tty2 - tty2
/dev/tty3 - tty3
/dev/tty4 - tty4
/dev/tty5 - tty5
/dev/tty6 - tty6
Run Code Online (Sandbox Code Playgroud)
小智 10
让我们退后一步,从困惑开始:什么是 tty?最初 tty 是电传打字机的缩写,后来成为玻璃电传打字机,它成为任何终端或与一个终端的连接,特别是串行端口(这些仍然存在,最常见的是 /dev/ttyS0、/dev/ttyUSB0 和有时是 /dev/ttyacm0)。然后你得到了伪 ttys 和虚拟 ttys。老 Unix 手熟悉伪 tty,它们用于远程终端(ssh 和 telnet)、虚拟终端(xterm 等)和终端多路复用器(screen 和 tmux)。随着时间的推移,伪 ttys 有多种命名方案,但当前使用的名称是 /dev/pts/0。另一方面,虚拟 tty 与虚拟控制台相关联,特别是当您使用控制 alt 功能键时,您正在切换虚拟控制台,每个控制台都与一个虚拟 tty 配对。
因此,如果您需要找到您的伪 tty(或使用文本模式时的虚拟 tty),有各种各样的解决方案,例如who am i
或者ps ax|grep $$
这相对容易做到,因为有多种方法可以找到这一点,因为伪 tty 在标准 io 上打开在大多数情况下,即使 io 被重定向,也有其他方法可以工作。只要您不使用图形终端仿真器或终端多路复用器,这也具有在使用串行端口和虚拟 tty 时也能做正确事情的优点。
但是,如果您想识别虚拟控制台怎么办?sudo fgconsole
可能对交互式案例有用。或者我所做的只是走控制台,因为切换通常足够快。我不知道在非交互式或非前台情况下可靠工作的编程方法。
让我们看一个示例,该示例保证永远无法可靠地应答虚拟控制台。我坐在 (alpha) 前面的计算机有一个在 tty2(:1) 上运行的 Xserver,我打开了三个窗口,两个 xterms 和一个 vncviewer(连接到 bravo:2)。一个 xterm 运行 screen,另一个运行 ssh charley。Screen 打开了两个窗口,ssh delta 和 who(谁在第二列中正确识别了伪 tty,并(:1:S0)
在第五列中提供了提示,告诉我们伪 tty 连接到第一个屏幕会话,该会话连接到第二个 X 服务器,但不提供任何虚拟控制台信息)。在任一 ssh 会话上运行 who 会给出提示(alpha)
它标识了 ssh 会话来自的机器,它对于远程会话来说比较好。尽管几乎没有关于连接到伪 tty 的信息(并且绝对没有虚拟控制台甚至远程 tty 信息可用),但至少可以识别远程主机。由于屏幕会话是可分离的,因此有关屏幕的信息可能是错误的,而 vnc 根本没有提供任何有用的信息,因为 vnc 会话和本地会话之间的唯一区别是显示编号。在许多情况下,您可以假设 :0 在 tty7 上,但并非总是如此,并且永远不会在我的上,因为 bravo 根本没有图形卡,而 :0 是 vnc 会话(这会混淆谁,因为它认为它是本地控制台)并且没有任何机器使用 tty7 作为图形会话,因为我(不仅仅是相反)将日志转储到 tty7(和 tty5,tty6 和 tty8 也)在其他地方重新绑定图形会话。但是等待屏幕也可以充当终端程序,允许您通过串行电缆建立会话。当谁运行时,这样的会话报告什么?为什么只需要串行端口,无论是通过 vnc、xterm、ssh、屏幕和 USB 串行适配器,还是连接到我的电视视频。
当您登录到 tty 时,它会自动在第一行显示您正在使用的 tty。
如果按键盘组合Ctrl+ Alt+F3仅显示黑屏,如您在评论中所写,则有另一种方法可以在启动计算机时访问 root shell,而无需按Ctrl+ Alt+ 调F3出 tty。
在启动过程中出现 BIOS/UEFI 闪屏后,在 BIOS 中,快速按住该Shift键,这将调出 GNU GRUB 菜单。(如果您看到 Ubuntu 徽标,您就错过了可以进入 GRUB 菜单的位置。)使用 UEFI 按下(可能多次)进入 GRUB 菜单的Esc键。有时制造商的启动画面是 Windows 引导加载程序的一部分,因此当您启动机器时,它会直接进入 GRUB 屏幕,然后Shift不需要按下。
从第一个紫色的 GNU GRUB 屏幕中,选择Ubuntu 的高级选项?和 ?键并按Enter。然后你会被另一个紫色的 GNU GRUB 菜单提示,其中有一个内核选项列表。
按向下箭头键,直到选择顶部的第二个条目(说明中具有恢复模式的条目),然后按Enter。
现在你应该看到这个恢复菜单:
使用箭头键向下滚动到root,然后按Enter。
您现在应该看到一个根提示,如下所示:
root@ubuntu:~#
Run Code Online (Sandbox Code Playgroud)
在这个阶段,你应该有一个只读文件系统。您必须使用写入权限重新安装它:
mount -o rw,remount /
Run Code Online (Sandbox Code Playgroud)
现在您可以像在终端中一样运行命令。
小智 5
使用命令 tty,它适用于 Linux 和 macOS,并给出一个非常简单的输出以供读取,只有您所在的 tty 的名称。
例子:
$ tty
/dev/pts/0
Run Code Online (Sandbox Code Playgroud)
编写脚本或将其包含在提示中很容易,例如:
$ PS1='`tty`: '
/dev/pts/0: _
Run Code Online (Sandbox Code Playgroud)
这样您就可以始终知道自己位于哪个航站楼。