1. 终端登录
终端登录要么是本地的要么是远程的。在这两种情况下,登录都要经由内核中的终端设备驱动程序。终端登录至UNIX系统。该过程是类似的,而与所使用的终端无关,终端可以是基于字符的终端、仿真简单的基于字符终端的图形终端,或者是运行窗口系统的图形界面。
1.1. BSD终端登录
系统管理员创建名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明了设备名和传递给getty程序的参数。当系统自举时,内核创建进程ID为1的进程,也就是init进程。init进程使系统进入多用户状态。init进程读配置文件/etc/ttys,对于每一个允许登录的终端设备,init调用一次fork,它所生成的子进程则执行(exec)getty程序。
getty为终端设备调用open函数,以读、写方式将终端打开。一旦设备被打开,文件描述符0、1、2就被设置到该设备。然后,getty就输出"login:"之类的信息。当用户键入了用户名,getty的工作就完成了,类似的调用方式如下:
execle("/bin/login", "login","-p", username, (char *)0, envp);
因为init具有超级用户特权,所以它fork的所有子进程都有超级用户特权。login得到了用户名,就能调用getpwnam取得相应用户的口令文件登录项。然后调用getpass以显示提示"Password:",接着读用户键入的口令。它调用crypt将用户键入的口令加密,并与该用户在阴影文件中的登录项的pw_passwd自导比较。如果用户几次键入的口令都无效,则login以参数1调用exit表示登录失败。父进程(1)了解到子进程的登录终止情况后,将再次调用fork&