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

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

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

我在/dev下看到了很多tty文件,在/dev/pts/下看到了很多pts文件,我不知道为什么有这么多。它们都被使用了吗?

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

例如gnome-terminal /dev/pts/47

更新

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

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

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

echo "hello" > /home/myhomefoler/pty_created_by_socat

答案1

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

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

如果 tty 是机器的视频控制台,则写入其中的数据将显示在屏幕上,来自键盘的数据将显示在 tty 上。

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

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

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

但是:为什么需要选择分配的伪终端设备的编号?内核选择一个未使用的、保证可用的。您是否有理由希望它选择不同的一个?

至于你的另一个问题:

我在/dev下看到了很多tty文件,在/dev/pts/下看到了很多pts文件,我不知道为什么有这么多。它们都被使用了吗?

这取决于系统。在某些系统上,所有可能的伪终端设备都在/dev/pts或中预先创建/dev,无论它们是否正在使用。在其他设备上,设备节点仅在使用伪终端时才存在。你说你用的是Ubuntu,它用的是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

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

相关内容