linux终端闲谈

晨曦之光 发布于 2012/04/10 14:59
阅读 315
收藏 0

为何向ssh之类的终端设备文件必须成对出现,而诸如tty或者串口或者slip之类的终端只有一个设备文件即可,这不得不从终端的本质说起,其实像串口或者s符合lip规程之类终端和tty/console终端本质是一样的,只不过tty的设备线路是用pci,agp之类的总线连接,其终端设备就是键盘,显示器/打印机之类的,而串口连接的终端是通过诸如RS232之类的接口连接的,这类终端只是延长了键盘,显示器而已,后来的X window的设计思想也是利用了这个思想,只不过终端完全进化成了一个图形服务器,以前的终端只能显示字符,输入字符,X终端却可以画图,显示不同图像以及任意操作这些图形等等,从终端的思想理解X系统就会明白为何xterm是X客户端而不是服务器了,不过这是后话,此文不谈。
     现在考虑ssh使用的伪终端,如果你彻底理解openvpn的工作原理,那么理解ssh伪终端就简单多了,这类终端使用ssh协议进行和主机通信,而ssh是一个应用层协议,因此就必须对登录ssh终端的用户屏蔽掉“数据到达应用层”这个信息,而使它们感到数据是直接由设备驱动产生的,也就是说让远程使用ssh连接到linux主机的用户敲击键盘时感到好像在linux主机敲击键盘是一样的,而不是让他们感到键信息先到达linux主机的应用层sshd守护进程,然后再“通过某种方式”“模拟”出“好像在linux主机敲击键盘”这件事,比如可以通过往input设备中写键信息。总之,数据到达sshd之后必须通过某种方式再次进入内核,然后再从内核返回到用户空间特定的应用。反过来理解,如果在/dev/ttyn终端上,当往/dev/ttyn写入一个字符时,该字符直接进入内核,然后通过驱动的帮助传输到系统总线或者从串口出去,最终到达输出设备,而是用ssh伪终端的话,一旦往/dev/pts/n写入一个数据,逻辑上数据可以直接到达远程的主机,比如windows主机的SecureCRT窗口中,可是实际上数据需要到达内核后然后返回用户空间的sshd,然后通过套接字将数据发送到远程主机的显示窗口中,这就需要在内核和sshd之间建立一条通道,字符设备是可以的,正如openvpn那样。因此ssh本质上也是建立了一条“虚拟的物理通道”数据发往sshd的那一刻起就相当于进入了物理通道,比如连接远程的RS232接口或者本机的agp总线,该物理通道是由ssh协议来实现的。最终的通道上匝道是通过成对的终端实现的,而此成对的终端其实就是一对管道,从一端写入数据可以从另一端读出,bash将数据从/dev/pts/n写入,然后sshd从/dev/ptmx被读出,反之亦然。
     在openvpn中,虚拟网卡和用户空间的openvpn进程之间通过一个字符设备建立了一个通道的上下匝道,而ssh则是通过一对实质上是管道的终端来建立通道上匝道的,注意,ssh终端没有下匝道,因为数据到达windows机器或者其它机器后就直接被回显了。


原文链接:http://blog.csdn.net/dog250/article/details/5692603
加载中
返回顶部
顶部