终端就是处理计算机主机输入输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入,典型的终端包括显示器键盘套件,打印机打字机套件等。如插在机器上的USB键盘或者PS/2键盘就是终端,它是一种输入终端;机器上并没有看到显示器或者键盘接口,但是却有一个串口,想操作这台机器想必只能通过这个串口来进行了,这个时候,串口另一端的那台电脑的显示器键盘也叫做终端;我们使用的类似SecureCRT这种软件上运行的SSH,Telnet等也算是一种终端程序,只是说它是通过TCP/IP网络而不是通过串口与主机连接的。
终端肇始于tty,tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
tty设备包括
• 本地终端
用VGA连接主机和显示器,用PS/2或者USB连接主机和键盘,这样的一个显示器/键盘组合就是一个本地终端。在linux中,/dev/tty1~/dev/tty63代表的是本地终端,也就是接到本机的键盘显示器可以操作的终端。换句话说,你往/dev/tty3里写个东西,它就会显示在显示器对应的终端。
事实上Linux内核在初始化时会生成63个本地终端,通过键盘上的Fn-Alt-FX(X为1,2,3…)可以在这些终端之间切换,每切换到一个终端,该终端就是当前的焦点终端。
• 用串口连接的远程终端
通过串口线把主机接到另外一个有显示器和键盘的主机,通过运行一个终端模拟程序,如通过SecureCRT选择Serial协议。
以ttyS 开头的就是串口连接的终端,比如ttyS1,ttyS2…,若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1端口的设备上。
• 用TCP/IP承载的远程终端
类似Telnet,SSH这般。比如在Windows使用telnet 或ssh等方式登录Linux主机。
以上几类都是在本地就直接关联了物理设备的,比如VGA口、PS/2口和串口啊之类的,这种终端叫做物理终端,而第三类在本地则没有关联任何物理设备,我们称之为伪终端pty(pseudo-tty)。
• 伪终端
以/dev/pts/n(n=0、1、2..)格式的是伪终端,它是由ptmx/pts结合使用实现pty的,它是成对出现的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。也就是说pts(pseudo-terminal slave)是pty的实现方法,和ptmx(pseudo-terminal master)配合使用实现pty。如当有ssh客户端连接后,sshd会fork一个进程,然后在子进程中打开一个叫做/dev/pts/0(或者1,2,3,4,5…)的设备,然后和客户端sshd进程的/dev/ptmx配对,这样在ptmx与pts之间就构成了一条管道。
我们可以使用tty命令来查看当前使用的终端,假如从SecureCRT ssh登陆到shell,
[root@localhost ~]# tty
/dev/pts/0
此时产生一个伪终端,为pts/0。当我们再打开一个回话窗口,
[root@localhost ~]# tty
/dev/pts/2
[root@localhost ~]# who
root pts/0 2019-05-06 13:26 (192.168.105.38)
root pts/2 2019-05-06 16:31 (192.168.105.38)
无论你在哪个终端下工作,我们都可以用/dev/tty表示终端自身,当你往/dev/tty里写东西的时候,它总是会马上出现在你的眼前。
[root@localhost ~]# echo "hello" > /dev/tty
hello
此时查看伪终端设备使用情形
[root@localhost ~]# ll /dev/pts/
total 0
crw--w---- 1 root tty 136, 0 May 6 16:58 0
crw--w---- 1 root tty 136, 2 May 6 16:58 2
c--------- 1 root root 5, 2 Feb 18 17:11 ptmx
可以看到当前有2个伪终端对应到ptmx。/dev目录下的各种tty,ptmx,pts/X,console等都是操作某种终端设备的设备文件而已,这些设备文件对应的就是显示器键盘套件,串口,SSH,Telnet等。