BSD终端登录
BSD终端的登录程序在过去35年都没有改变。
BSD: Berkeley Software Distribution,是Unix的衍生系统,“BSD”并不特指任何一个BSD衍生版本,而是类UNIX操作系统中的一个分支的总称。
getty:打开终端设备,等待用户输入以回车结束的字符(用户名),等待输入完成后调用login程序,完成程序使命.
- 过程
系统创建/etc/ttys文件,这个文件记录了所有的终端设备,每个设备占一行,每一行说明设备名和传到getty程序的参数。操作系统启动后,init进程会读取这个/etc/ttys文件,对每一个允许登录的终端设备,init调用一次fork,fork出的子进程执行exec getty程序
getty对终端设备调用open函数,以读/写方式将终端打开。一旦设备被打开,文件描述符0,1,2就被设置到该设备,然后getty输出login之类的信息,并等待用户键入用户名。用户键入用户名之后,getty的工作就结束了,然后该程序再调用login程序
login程序可以得到用户名,然后调用getpwnam取得对应用户的口令文件登录项,调用getpass显示提示"Password",接着读用户键入的口令,再调用crypt将用户键入的口令加密,对比shadow文件中的密码,如果多次输入错误的话,login程序退出。init得到该子进程退出的情况后,再次fork,然后又执行getty,对此种终端重复上述过程。如果密码输入成功的话,login接下来的工作:
- 将当前工作目录更改为用户起始目录
- 调用chown更改该终端的所有权为登录用户
- 将该终端设备的访问权限变为“用户读写”
- 调用setgid及initgroups设置进程的组id
- 用login得到的所有信息初始化环境
- login进程setuid为登录用户的id,并调用该用户的shell
BSD网络登录
上面的终端登录是串行终端登录至系统,init进程知道哪些终端设备可以登录,并为每个设备生成一个getty进程。网络登录不再是点对点登录,事先不知道有多少登录,必须等待网络请求到达,而不是使一个进程等待每一个可能的登录
(1) 概念
TELNET:TELNET是使用TCP协议的远程登录应用程序,类似明文版的ssh服务
(2)过程
为了使同一个软件既能处理终端登录,又能处理网络登录,系统使用了一种称为伪终端的软件驱动程序,它仿真串行终端的运行行为,并将终端操作映射为网络操作。
在BSD中,有一个inetd进程,它等待大多数网络连接,当一个连接请求到达时,它执行一次fork,fork出的子进程exec 适当的程序。
假设一个对于TELNET服务进程的TCP连接请求到达,客户主机执行“telnet hostname”,(即客户进程打开一个到hostname主机的TCP连接,在hostname主机上启动的程序被称为TELNET服务进程。然后客户进程和服务进程之间使用TELNET应用协议通过tcp连接交换数据)
然后telneted进程打开一个伪终端设备,并且fork分成两个进程,父进程处理通过网络连接的通信,子进程则执行login程序。父进程和子进程通过伪终端连接。在调用exec执行,子进程使其文件描述符与伪终端相连。login程序登录正确或错误会执行串口终端登录的过程