美文网首页LinuxLinux学习之路
APUE读书笔记-19伪终端(3)

APUE读书笔记-19伪终端(3)

作者: QuietHeart | 来源:发表于2020-09-29 17:15 被阅读0次

    伪终端的典型应用

    我们现在将会看看一些伪终端的典型使用。

    网络登录服务

    伪终端被编译成支持网络登录的服务。典型的例子就是telnetd和rlogind服务。第15章给出了rlogin服务的具体步骤。当登录shell运行在远程主机上面的时候,我们会有下面图形的结构。使用telnetd服务也会有类似的结构。

    rlogind服务进程的组织结构

           +--------------------+   fork     +-----------+
           |      rlongind      +------------>   login   |
           |       server       | exec,exec  |   shell   |
           +----/-----^---\---^-+            +---|----^--+
               /     /     \   \          stdout |    |stdin
              /     /       |   \         stderr |    |
    +......../...../........|...|................|....|.........+
    .   +---v-----/----+    |   |           +----v----|-----+   .
    .   |    TCP/IP    |    |   |           |    terminal   |   .
    .   +---|-----^----+    |   |           |line discipline|   .
    .       |     |         \    \          +----|----^-----+   .
    .       |     |          \    \              |    |         .
    .   +---v-----|----+    +-v----\---+       +-v----|--+      .kernel
    .   |    network   |    |   PTY    |       |   PTY   |      .
    .   | device driver|    |  master  |       |  slave  |      .
    .   +------^-------+    +-|----^---+       +-|----^--+      .
    .          |              |    |             v    |         .
    .          |              v    +<------------+    |         .
    .          |              +---------------------->+         .
    +..........|................................................+
               v
      ...................
            network
    

    我们在rlogind服务和loginshell之间两次调用exec,因为login程序会在两者之间,用来用户验证。

    上面这个图形中的一个比较关键的地方就是驱动PTY master的进程一般同时都会也读取另外一个I/O stream。在这个途中,另外的I/O stream就是 TCP/IP box。这也意味着进程必须使用一些多I/O的形式,例如select或者poll,或者必须被分割成两个进程或者线程。

    script 程序

    script程序由大多数的UNIX系统提供,它会将终端会话过程中的任何输入输出拷贝到一个文件中去。这个程序通过将它自身放置在终端和我们新启动的一个登陆shell之间来做到这个。下面的图详细列出了script程序的交互。这里我们特别指出script程序一般从一个登陆的shell中运行,然后这个登陆的shell等待script终止。

    script程序的终端结构

                            +-----------+
                            |script file|
                            +-----^-----+
                                  |
    +-----------+ fork +----------|---------+   fork     +-----------+
    |login shell+------>  script process    +------------>   shell   |
    +-----------+ exec +----/-----^---\---^-+   exec     +---|----^--+
     (sleeping)            /     /     \   \          stdout |    |stdin
                          /     /       |   \         stderr |    |
                +......../...../........|...|................|....|.........+
                .   +---v-----/-----+   |   |           +----v----|-----+   .
                .   |    terminal   |   |   |           |    terminal   |   .
                .   |line discipline|   |   |           |line discipline|   .
                .   +---|-----^-----+   \    \          +----|----^-----+   .
                .       |     |          \    \              |    |         .
                .   +---v-----|-----+   +-v----\---+       +-v----|--+      .kernel
                .   |    terminal   |   |   PTY    |       |   PTY   |      .
                .   | device driver |   |  master  |       |  slave  |      .
                .   +------^--------+   +-|----^---+       +-|----^--+      .
                .          |              |    |             v    |         .
                .          |              v    +<------------+    |         .
                .          |              +---------------------->+         .
                +..........|................................................+
                           v
                       - - - - --
                      / user at a\
                      \ terminal /
                       - - - - --
    

    当script运行的时候,任何经过PTY slave上面的终端行规则的输出都会被拷贝到script file(一个script的文件)中去(一般被称作typescript)。因为我们的键盘键入一般通过那个行规则模块来显示,所以script file也会包含我们的输入。然而由于密码不会被显示出来,所以script file不会包含我们输入的任何密码。

    当写这本书的第一个版本的时候,作者Rich Stevens使用script程序来捕获例子程序的输出。这个避免了相比较他自己手动来拷贝这些程序的输出,导致的印刷上面可能遇到的错误。然而,script程序的缺点就是,需要处理出现在script file中的控制字符。

    在后面写的pty程序的时候,我们将会看到一个简单的shell脚本将这个程序变成一个script程序。

    相关文章

      网友评论

        本文标题:APUE读书笔记-19伪终端(3)

        本文链接:https://www.haomeiwen.com/subject/imtluktx.html