进程关系之终端登录

这篇博客详细介绍了UNIX系统中终端登录的过程,包括本地和远程登录。讲解了init进程如何启动getty,getty如何接收用户输入,以及login程序进行身份验证的步骤。还提到了PAM(可插入式身份验证模块)和网络登录时使用伪终端的情况。最后,讨论了登录shell如何读取启动文件并执行用户环境。
摘要由CSDN通过智能技术生成

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&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值