网络登陆

网络登陆

登陆系统通过串行终端和通过网络的主要不同在于终端和计算机不是点对点的。

在终端登陆中,init知道哪个终端设备可以用于登陆并产生一个getty进程。在网络登陆中,所有登都要通过内核的网络接口设备(也就是网卡驱动),并且无法预知将会有多少连接。现在我们必须等待网络连接请求的到达,而不是用一个进程等待每个可能的登陆。

允许同一软件处理终端登陆和网络登陆,这软件被叫做pseudo terminal,它仿真串行终端的行为并且映射终端操作到网络操作(反之亦然)。

BSD网络登陆

做为系统启动的一部分,init调用一个shell去执行/etc/rc脚本。其中一个被启动的守护进程就是inetd。一但脚本结束inetd的父进程变成initinetd等待TCP/IP连接请求。当收到一个连接请求时,inetdforkexec函数调用适当的程序。

假设一个TELNET服务器,用户从远端使用TELNET登陆到服务器上:

telnet hostname

figure9-4

之后telnetd进程会打开一个pseudo-terminal设备并使用fork分成两个进程。父进程处理网络通信,子进程使用exec调用login程序。父、子进程都是通过pseudo terminal连接的。在使用exec之前子进程会设置文件描述符0、1、2到pseudo terminal上。如果成功登陆,login程序会改变我们的home文件夹,并设置组ID,用户ID,和初始环境变量。之后login程序通过调用exec,用我们的shell替换它自己。

本节的重点是:无论通过终端还是网络,都会有一个拥有标准输入、标准输出和标准出错文件描述符的登陆shell,连接到终端设备或pseudo-terminal设备。

Comments are closed.