unix环境编程 第九章 9.2 终端登录 && 9.3 网络登录

本文详细介绍了BSD系统的终端登录流程,从getty程序启动到login验证,再到用户环境的建立。同时,讨论了网络登录,特别是TELNET服务如何通过伪终端实现远程登录,涉及inetd进程和伪终端设备的角色。深入理解这些过程有助于了解类UNIX操作系统的登录机制。
摘要由CSDN通过智能技术生成

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接下来的工作:

  1. 将当前工作目录更改为用户起始目录
  2. 调用chown更改该终端的所有权为登录用户
  3. 将该终端设备的访问权限变为“用户读写”
  4. 调用setgid及initgroups设置进程的组id
  5. 用login得到的所有信息初始化环境
  6. 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程序登录正确或错误会执行串口终端登录的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值