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

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

作者: QuietHeart | 来源:发表于2020-10-12 16:08 被阅读0次

(6)通过非交互的方式驱动交互程序

尽管我们觉得pty可以运行任何协作处理进程(甚至一个协作处理进程是交互的进程),它并不会正常工作。问题是,pty只是仅仅将它的标准输入的内容拷贝到PTY,以及将PTY的所有内容拷贝到它的标准输出,却不会检查它究竟发送了什么以及获取了什么。

作为一个例子,我们可以在pty下面运行telnet命令直接与远程主机交互:

pty telnet 192.168.1.3

这样做,并不比直接键入telnet 192.168.1.3好多少,但是我们可能想要telnet程序从一个脚本中运行,并且可能会检测远程主机上面的一些条件。如果文件telnet.cmd包含这四行:

sar
passwd
uptime
exit

其中第一行远程登陆的用户名称,第二行是密码,第三行是我们想要运行的命令,第四行是终止会话的行。但是如果我们如下运行这个脚本:

pty -i < telnet.cmd telnet 192.168.1.3

它并没有如我们所想的方式工作。所发生的事情应就是,文件telnet.cmd中的内容在开始提示我们输入用户名称和密码之前就被发送到远程主机上面。当关闭回显读取密码的时候,login程序使用tcsetattr选项,导致所有已经被排队的数据被丢弃。因此,我们发送的数据被丢弃了。

当我们交互运行telnet程序的时候,我们等待远程主机提示密码,然后我们才开始输入。但是pty程序不知道需要这样做,所以导致前面所说的那个现象。因此,需要一个更复杂的程序来实现这个功能,例如expect程序,通过这个程序才能正常地从一个脚本中以非交互的方式来运行一个交互的程序。

即使运行前面我们展示的"使用伪终端来驱动一个协作处理进程(扩展之前)"对应的程序,也没有什么作用。因为,程序假设每向一个管道写一行,也会在另外一个管道产生同样的一行。在交互处理程序中,一行输入可能会产生许多行输出,并且,前面途中的程序经常会在读取之前向协作处理进程发送一行数据。这样,当我们想要在发送之前从协作处理进程中读取一些数据的时候,就不能正常地工作了。

这里,有一些方法可以从一个脚本来启动交互处理程序。我们可以添加一个命令语言,以及给pty程序添加一个解释器,但是这样的话那个语言本身可能就比pty程序复杂多了。另外一个方法就是,采用一个命令行语言,然后使用pty_fork函数来发起交互程序。这也是expect程序所做的事情。

我们会采用不同的路径,并且添加一个-d选项,允许pty程序连接到驱动的进程的输入和输出。进程的标准输出是pty的标准输入,反之同样。这和协作处理进程类似,但是在pty的"另外一端",结构和"将伪终端作为协作处理进程的输入输出来运行写作处理进程(扩展后)"是几乎一样的。但是在当前的情况中,pty对驱动的进程做了一步fork和exec的操作。并且,不是使用两个半双工的管道,我们将要在pty和驱动的进程之间,使用一个全双工的管道。

下面的代码展示了do_driver函数的源代码,这个函数会在指定-d选项的时候,被pty的main函数调用(参见前面"pty程序的main函数")。

相关文章

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

    (6)通过非交互的方式驱动交互程序 尽管我们觉得pty可以运行任何协作处理进程(甚至一个协作处理进程是交互的进程)...

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

    (7)pty程序的do_driver函数 通过我们自己写的被pty调用的driver程序,我们可以以任何需要的方式...

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

    查看长时间运行的程序的输出 如果我们有一个程序,那个程序运行很长的时间,我们可以在任何一种标准的shell下面将这...

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

    2、概述 伪终端的意思是,这个终端对于应用程序来说表现像是一个终端,但是实际上它并不是一个真正的终端。下面的图就展...

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

    (3)基于Linux的伪终端 Linux提供访问伪终端的BSD方法,所以可以使用上面代码中同样的函数在Linux上...

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

    (4)script程序 使用pty程序,我们可以如下通过shell脚本执行script程序: 当我们运行这个she...

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

    远程模式 通过使用ioctl的TIOCREMOTE命令,PTY master可以设置PTY slave为远程模式。...

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

    伪终端的典型应用 我们现在将会看看一些伪终端的典型使用。 网络登录服务 伪终端被编译成支持网络登录的服务。典型的例...

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

    (2)基于BSD的伪终端 在基于BSD的系统中,和基于Linux的系统中,我们提供了自己的XSI函数版本。 在我们...

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

    3、打开伪终端设备 SUS尝试统一的伪终端处理函数 我们打开伪终端设备的方式随平台有所不同。Single UNIX...

网友评论

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

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