客户端处于实验图的③处。打开新的终端(终端C),这里简单地使用nc连接远程socket,并且nc的输入输出重定向至键盘、显示器即可。但是要注意,nc是运行在终端C上的,而终端C的默认属性会拦截字符Ctrl+C、使用行缓冲区域。这样nc的输入输出其实并不直接是键盘、显示器。为此,我们先设置终端C的属性,再运行nc:
stty raw -echo nc localhost 2333 #改行没有回显,要摸黑输入
然后,在终端C中出现了我们打印的setsid的信息,和login的提示符。在终端C中,使用键盘可以正常登录,得到shell的提示符。使用tty命令能够看到当前shell使用的控制终端是/dev/pts/20,也就是我们创建的伪终端。输入w命令可以看到系统中登录的用户和登录终端。
至此为止,我们实现了类似telnet的远程登录。
结语linux中终端驱动本身有回显、行缓存、作业控制等丰富的属性,在此基础上实现的伪终端在终端模拟器、远程登录等场合下能够得到多种应用。
在实验过程中也牵扯到进程控制、输入输出重定向、网络通信这么多的知识,更体现出linux的复杂精致的结构。我感觉,linux 就像一个包罗万象、又自成体统的小宇宙,它采用独特的虚拟化技术,灵活的模块化和重用机制,虚拟出各种设备,实现了驱动程序的随意拼插。在这里,所有模块都得到了充分的利用,并能够像变形金刚那样对各类需求提出面面俱到的解决方案。