在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
我可以通过从其他地方连接到端口2222来获得外壳。从安全角度来看非常危险!!!