伪终端的典型应用
我们现在将会看看一些伪终端的典型使用。
网络登录服务
伪终端被编译成支持网络登录的服务。典型的例子就是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程序。
网友评论