转自http://www.xuebuyuan.com/877887.html

2013年09月07日 ⁄ 综合 ⁄ 共 4047字 ⁄ 字号    ⁄ 评论关闭

Linux上许多网络服务应用,如l2tp、pptp、telnet,都用到了伪终端。有朋友在问这方面的概念,把偶知道的写下来,以供讨论。

一、终端
要理解伪终端(Pseudo Terminal),先来看看什么是“终端”(Terminal)。

终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。

1、串行端口终端(/dev/ttySx)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。
这些串行端口所对应的设备名称是/dev/ttyS0、/dev/ttyS1等,分别对应于DOS系统下的COM1、COM2等。

  1. [root@Kendo ~]# ls -l /dev/ttyS*
  2. crw-rw---- 1 root uucp 4, 64 Jan  8 13:39 /dev/ttyS0
  3. crw-rw---- 1 root uucp 4, 65 Jan  8 13:39 /dev/ttyS1
  4. crw-rw---- 1 root uucp 4, 66 Jan  8 13:39 /dev/ttyS2
  5. crw-rw---- 1 root uucp 4, 67 Jan  8 13:39 /dev/ttyS3

复制代码

2、控制台终端(/dev/ttyn, /dev/console) 
在Linux系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),
与之相关联的设备文件为:tty0、tty1、tty2……。当用户从控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换
到tty2、tty3……上面去。tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。
因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。用户可以登录到不同的虚拟终端上去,因而可以让系统同时有几
个不同的会话期存在。只有系统或超级用户root可以向/dev/tty0进行写操作。

作为一个测试例子,在控制台终端下,运行命令:

  1. #echo "write to ttyS0" > /dev/ttyS0

复制代码

在串行端口终端中可以看到输出:

  1. # write to ttyS0

复制代码

3、控制终端(/dev/tty) 
控制终端并不面对设备,而是面对进程,关于这个概念,《Unix环境高级编程》第9章有详细论述。

二、从终端登录简述

Linux系统引导的时候,会运行init进程,它会执行/etc/inittab(这跟具体的init类型有关,我使用了busybox的init,但其本质是一样的):

  1. [root@SkyNet ~]# cat /etc/inittab
  2. ::sysinit:/etc/init.d/rcS
  3. ::respawn:/sbin/getty 9600 ttyS0

复制代码

它会调用getty在指定波特率上打开ttyS0,即,串行端口终端。打开成功后,stdout,stdin,stderr都被设置到该备上,然后getty输出:"login:"之类的提示符,等待用户输入。

当用户键入用户名后,getty就执行login程序,类似于:execle("login")。login可以调用getpass()以显示Password:并读入用户口令。并且调用getpwnam进行口令验证。如果成功,调用类似execle("shell")。这样,登录用户就拥有了一个shell了。

三、伪终端
上述登录过程,对于网络用户来说,却不能完全实用。很显然,网络用户并不需要一个串口,也不需要一个显示器,他需要的是在他的本地显示设备上,运行Linux的shell。这种网络用户被称为网络虚拟终端。以telnetd为例,它至少应该是这样子的:

图一:telnet登录假想图

这里,这个“某个终设备”,自然不可能是一个实际的物理终端设备,因为压根没有这样的设备。这样,伪终端的概念就被引入进来了。伪终端设备是一种特殊的终端驱动设备, 它并不驱动某个物理设备,而是用来将终端的输出定向到应用程序中进行处理。伪终端设备之所以存在是为了提供在程序控制下的一种模拟串行终端行为的方法。

伪终端与前面说的终端在表现形式上,最大的不同,就是它总是成对出现,而不是单一的一个。它分为“伪终端主设备(/dev/ptyMN)”和“伪终端从设备”。(/dev/ttyMN)。其中,M与N的命名方式如下:

  1. M: p q r s t u v w x y z a b c d e 共16 个
  2. N: 0 1 2 3 4 5 6 7 8 9 a b c d e f 共16 个

复制代码

这样,默认支持最大是256个。

任何写入到伪终端主设备的输入,都会作为伪终端从设备的输入,反之亦然。类似于管道,如下图:
 
一个典型的伪终端进程结构如下图:
 
这张图的关键在于:如果把伪终端从设备想像为传统的终端设备,把主设备看成进程读写数据的一个“接口”,那么它的工作原理,就跟传统终端一样了。

上述只是一个本地进程,把网络引入进来,对应到telnetd上面来,应该是下面这个样子:

同样的登录方式,就变成了这样:
1、如果某人在网上使用telnet程序连接到本地服务器,则telnetd程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端主设备上)。
2、telnetd产生一个子进程,进行getty程序,其打开一个对应的从设备对应的ttyp2(s2),并设置stdin\stdout\stderr;
3、telnetd通过内核tcp/ip协议栈从远端获取了一个字符时,该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnetd程序往网络上返回”login:”字符串信息;
4、这样,登录程序与telnetd程序就通过“伪终端”进行通信;

四、伪终端的数量
对于Linux下的应用而言,知道伪终端的数量是一个关键的东东,或者它直接决定了最大支持用户数,例如PPTP VPN的应用。(没有多余的可以供打开的
伪终端设备了)。
对于2.6.X而言,在

  1. Device Drivers  --->
  2. Character devices  --->
  3. [*] Legacy (BSD) PTY support
  4. (256) Maximum number of legacy PTY in use

复制代码

可以设定。应该将它调整到足够地大,以供支持应用。同时,/dev目录下,应该有相应的设备文件:

  1. #ls -l /dev/ptyp*
  2. crw-r--r--    1 root     root       2,   0 Dec 18 05:36 /dev/ptyp0
  3. crw-r--r--    1 root     root       2,   1 Dec 18 05:36 /dev/ptyp1
  4. crw-r--r--    1 root     root       2,   2 Dec 18 05:36 /dev/ptyp2
  5. crw-r--r--    1 root     root       2,   3 Dec 18 05:36 /dev/ptyp3

复制代码

  1. #ls -l /dev/ttyp*
  2. crw-------    1 root     root       3,   0 Dec 18 05:36 /dev/ttyp0
  3. crw-------    1 root     root       3,   1 Dec 18 05:36 /dev/ttyp1
  4. crw-r--r--    1 root     root       3,   2 Dec 18 05:36 /dev/ttyp2
  5. crw-------    1 root     root       3,   3 Dec 18 05:36 /dev/ttyp3

复制代码

这样命令方式,并且要指定数量的方式实在是让人郁闷。因为它有一个数量上限的问题,最大256。

为了解决这个问题,Linux引入了一种新的命名方式:UNIX98_PTYS。关于这个东东,内核是这样解释的:

  1. Linux has traditionally used the BSD-like names /dev/ptyxx for
  2. masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
  3. has a number of problems. The GNU C library glibc 2.1 and later,
  4. however, supports the Unix98 naming standard: in order to acquire a
  5. pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
  6. terminal is then made available to the process and the pseudo
  7. terminal slave can be accessed as /dev/pts/<number>. What was
  8. traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
  9. All modern Linux systems use the Unix98 ptys.  Say Y unless
  10. you're on an embedded system and want to conserve memory.

复制代码

这样,可以通过访问/dev/ptmx设备文件的形式,来访问伪终端设备了,例如我的PPTP服务器,当有五个用户拨入后:

  1. # ls -l /dev/pts/
  2. crw-------    1 root     root     136,   0 Jan  8 12:18 0
  3. crw-------    1 root     root     136,   1 Jan  8 08:08 1
  4. crw-------    1 root     root     136,   2 Jan  8 14:10 2
  5. crw-------    1 root     root     136,   3 Jan  8 14:27 3
  6. crw-------    1 root     root     136,   4 Jan  8 08:29 4

复制代码

linux的终端,网络虚拟终端,伪终端(转)的更多相关文章

  1. linux tty终端个 pts伪终端 telnetd伪终端

    转:http://blog.sina.com.cn/s/blog_735da7ae0102v2p7.html 终端tty.虚拟控制台.FrameBuffer的切换过程详解 Framebuffer Dr ...

  2. linux的终端,网络虚拟终端,伪终端(转)

      blog.csdn.net/todd911/article/details/8025540 Linux上许多网络服务应用,如l2tp.pptp.telnet,都用到了伪终端.有朋友在问这方面的概念 ...

  3. Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用

    本文介绍了linux中伪终端的创建,介绍了终端的回显.行缓存.控制字符等特性,并在此基础上解释和模拟了telnet.SSH开启远程会话的过程. 一.轻量级远程登录 之前制作的一块嵌入式板子,安装了嵌入 ...

  4. Linux 伪终端(pty)

    通过<Linux 终端(TTY)>一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端.使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vS ...

  5. Linux 串行终端,虚拟终端,伪终端,控制终端,控制台终端的理解

    转自Linux 串行终端,虚拟终端,伪终端,控制终端,控制台终端的理解 终端:输入和输出设备(键盘 + 显示器). 串行终端:与机器的串口对应,每一个串口对应一个串行终端,串口对应的是物理终端. 虚拟 ...

  6. 关于Unix/Linux的终端、伪终端、控制台和shell

    历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...

  7. linux下强制退出指定用户开启的伪终端

    一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 每次通过ssh登陆服务器,但是超时后自动断开了与服务器的连接,因此在 ...

  8. 终端、虚拟终端、shell、控制台、tty的区别

    终端与控制台的区别? 最近开始接触Linux,终端.虚拟终端.shell.控制台.tty等概念让我很混乱,有必要认识清楚. 今天看到有人问终端和控制台的区别,而且这个问题比较有普遍性,因此想抽出一点时 ...

  9. Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理

    摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 记录一下Linux下使命令不受终端断开的影响,保持在后台运行的几个方法及其原理.当用 ...

随机推荐

  1. oracle rac scan ip 用途 原理

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  2. epub格式电子书剖析之三:NCX文件构成

    ncx文件是epub电子书的又一个核心文件,用于制作电子书的目录,其文件的命名通常为toc.ncx. ncx文件是一个XML文件,该标准由DAISY Consortium发布(参见http://www ...

  3. import project后,出现Unable to get system library for the project

    import project 后,出现Unable to get system library for the project. 这是因为在import 一个项目的时候,没有指定android sdk ...

  4. hunnu Sum of f(x)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11546&courseid=0 Sum of f(x) ...

  5. 启动Selenium RC —— 我的第一个shell

    打开终端 1. 新建一个sh文件 $ vim a.sh 2. 写入以下内容 #! /bin/bash cd Desktop/selenium/jar java -jar selenium-server ...

  6. Raspberry Pi使用USB摄像头远程监控

    用到了开源项目:MJPG-streamer 开源项目的下载地址: http://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/mjpg-streamer ...

  7. Centos 6.5升级安装Git

    安装需求 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel# yum install gcc pe ...

  8. Unity给力插件之ShaderForge(三)

    地形模型材质: 使用Unity自带的地形会出现一些问题,所以我尽量使用手工制作的模型来制作地形.而地形又需要只使用一个材质球,于是在此制作一个简单的Shader. 效果图: 注意: 1.颜色遮罩的图片 ...

  9. SSAS使用MDX生成脱机的多维数据集CUB文件

    在运用多维数据进行分析的时候,通常很有可能我们需要把这些多维数据脱机进行处理或演示,这其中就要用到cub文件 http://www.cnblogs.com/yunhuasheng/archive/20 ...

  10. Oracle Tnsping慢

    http://www.linuxidc.com/Linux/2014-02/96167.htm http://www.askmaclean.com/archives/dns%E8%AE%BE%E7%B ...