是否可以使用指定的 tty/pty 打开终端

wor*_*tor 10 terminal tty

(我使用的是 Ubuntu。)在我看来,tty 只是一种端口。你输入一些东西,它应该输出一些东西。终端(模拟器)是处理这些输入和输出的软件。从字面上看,终端可以选择连接到哪个端口。

看到/dev里有很多tty文件,/dev/pts/里有很多pts文件,不知道为什么有这么多。都被利用了吗?

如果没有,我可以使用指定的 pty 启动终端吗?

例如 gnome-terminal /dev/pts/47

更新

我这样做的原因是我想要一个远程终端。我知道适当的方法是使用 ssh 或 telnet。

但是对于临时访问来说,不是很方便。我想使用 socat 将 tty 或 pty 转发给客户端。然后客户端可以使用该 pty 或 tty 启动终端。

以下代码工作正常。它在客户端执行,在服务器端我得到“你好”。

echo "hello" > /home/myhomefoler/pty_created_by_socat
Run Code Online (Sandbox Code Playgroud)

Cel*_*ada 11

在 UNIX 上,tty(与许多其他事物一样)显示为文件。写入 tty 设备的数据进入终端,来自终端的数据可在 tty 上读取。

如果 tty 是硬件串行端口,则写入它的数据将通过线路发送,并且来自线路的数据出现在 tty 上。

如果 tty 是机器的视频控制台,那么写入它的数据会显示在屏幕上,来自键盘的数据会出现在 tty 上。

如果 tty 是连接到 X 终端仿真器的伪 tty(虚拟终端),例如gnome-terminal那么写入它的数据将被传送到 X 终端仿真器软件,然后显示在窗口中,而输入到该窗口的数据可用用于在虚拟终端上阅读。据说该软件连接到伪终端的“主”端。真正的终端没有“主”端,因为它们背后有一个真正的设备(如串行端口),而不是由软件实现的虚拟设备。

因此,您已经可以看到,要求 X 终端仿真器在任意 tty 设备(例如/dev/ttyS0(Linux 上的真正串行端口)上运行)没有任何意义。它必须是一个伪 tty。

但是终端模拟器可以选择它使用的伪终端设备的数字ID吗?原则上,内核可以允许这样做,但实际上用于分配新伪终端的内核接口不支持它:内核自行选择。(在 SysV 模型中,/dev/ptmx伪终端是通过打开一个名为的特殊设备创建的,并且自动分配编号最低的可用伪终端设备。)

但是:为什么需要选择分配的伪终端设备的编号?内核选择一个未使用的保证可用和可用的。如果它选择不同的,你有什么理由让你更喜欢吗?

至于你的另一个问题:

看到/dev里有很多tty文件,/dev/pts/里有很多pts文件,不知道为什么有这么多。都被利用了吗?

这取决于系统。在某些系统上,所有可能的伪终端设备都在/dev/pts或中预先创建/dev,无论它们是否在使用中。在其他情况下,设备节点仅在使用伪终端时才存在。你说你使用的是 Ununbu,它使用 Linux,这是后一种类型。所以,是的,您看到的所有设备节点/dev/pts目前都在使用中。

但是对于临时访问来说,不是很方便。我想使用 socat 将 tty 或 pty 转发给客户端。然后客户端可以使用该 pty 或 tty 启动终端。

如果您希望socat或任何其他软件连接到伪终端的主端,那么您需要该软件专门支持这样做。但你很幸运,因为socat确实如此。例如,如果我运行:

socat PTY,link=/tmp/socat.pty TCP-LISTEN:2222 &
sleep 1 && ( setsid bash ) </tmp/socat.pty >/tmp/socat.pty 2>&1
Run Code Online (Sandbox Code Playgroud)

我可以通过从其他地方连接到端口 2222 来获得一个 shell。从安全的角度来看非常危险!!!