用户登录过程剖析-控制台-bash
用户在控制台登录基本流程是:由init进程启动getty产生几个虚拟控制台(tty1,tty2等)。在控制台上显示登录,当用户敲入用户时,getty执行(exec)登录(login)进程,进入登录认证过程过程,认证成功后,登录进程(login)会fork相应用户shell的子进程,至此登录过程结束。用户可以在对应的shell下工作。其过程是getty, login, shell一般是bash。
getty有init启动,其配置在/etc/inittab中,getty可以启动虚拟控制台如tty1,也可以启动串口(可用于调试内核)和modem,在inittab中的配置文件如下。
# Format: # <id>:<runlevels>:<action>:<process> # # Note that on most Debian systems tty7 is used by the X Window System, # so if you want to add more getty's go ahead but skip tty7 if you run X. # 1:2345:respawn:/sbin/getty 38400 tty1 2:23:respawn:/sbin/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn:/sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6 # Example how to put a getty on a serial line (for a terminal) # #T0:235:respawn:/sbin/getty -L ttyS0 9600 vt100 #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100 |
getty启动是会读取/etc/issue文件并且在控制台上显示,一般是发行版的一些信息,节点名等。
Login的基本流程如下图。
login的配置文件是/etc/login.defs, 其认证对应的重要文件是/etc/pam.d/login,这里定义了认证的限制(如怎么禁止非root用户登录,如何限制特定用户登录),以及认证成功后一些环境变量(如mail位置设定,资源限制设定)的设定。
重要的login相关的pam配置文件设定:
限制root在指定的虚拟终端登录:
Disallows root logins except on tty's listed in /etc/securetty # (Replaces the `CONSOLE' setting from login.defs) auth [success=ok ignore=ignore user_unknown=ignore default=die] pam_securetty.so |
限制非root用户登录:配置文件/etc/nologin存在则只允许root登录。
# Disallows other than root logins when /etc/nologin exists # (Replaces the `NOLOGINS_FILE' option from login.defs) auth requisite pam_nologin.so |
限制特定用户登录
# Uncomment and edit /etc/security/access.conf if you need to # set access limits. # (Replaces /etc/login.access file) # account required pam_access.so |
access.conf的文件格式比较复杂,请参考发行版的配置文件。
环境变量
# parsing /etc/environment needs "readenv=1" session required pam_env.so readenv=1 |
本地化变量
# locale variables are also kept into /etc/default/locale in etch # reading this file *in addition to /etc/environment* does not hurt session required pam_env.so readenv=1 envfile=/etc/default/locale |
资源限制
# Sets up user limits according to /etc/security/limits.conf # (Replaces the use of /etc/limits in old login) session required pam_limits.so |
用户在登录成功后,login启动/etc/passwd文件中用户指定的SHELL,通常是Bash,Bash相应的配置文件和启动过程如下图。
说明:Bash有几种启动方式:
交互式登录:即是在登录过程中由登录进程创建的Bash子进程,如login进程启动的Bash,ssh登录时,sshd创建的子进程。
非登录的交互式:如在图形界面中,启动的终端。
非交互式:如运行脚本。
对于图中的文件的权限是登录用户可读。在系统终端的登录中,bash是使用第一种启动方式。
至此用户登录结束,用户进入交互式终端。总之用户要进入终端对系统进行操作,其过程由内核启动,init进程fork产生getty等待用户登录,用户在登录时候getty使用login进程(exec调用)替代自己,成功后login创建Bash子进程,用户进入终端界面。其中每一个程序都有自己的配置文件,设置环境变量等,如在login过程中可以设置环境变量LANG,Bash中也可以设置,且结果是,后面设置的取代前面的。Login设置的是全局的环境变量,Bash可以是全局的在/etc/下的配置文件,也可以在用户的home目录下设置用户的环境变量。
问题思考: 结合系统登录过程,如何设置所有用户的LANG环境变量为zh_CN.GBK? 某一用户呢?