1.linux登录过程概述

回到顶部

linux系统启动大致经过如下几个步骤:

              系统上电->BIOS->bootloader(grub)->linux内核->init进程(systemd)->getty->login->shell(bash)
            

linux内核启动后执行的第一个用户进程为init进程,init进程初始化多用户环境后执行getty程序。 在pstree -a或者ps aux命令的输出中,可以看到以下进程:
/sbin/agetty -o -p -- \u --noclear tty1 linux
getty由init进程启动,主要功能就是打开终端,提供用户登录界面供用户输入用户名登录。 使用Ctrl+Alt+F1/2/3/4/5/6打开的虚拟终端就是由getty进程提供的。
init进程关于tty的配置文件/etc/init/tty.conf:

              # cat /etc/init/tty.conf
stop on runlevel [S016] respawn instance $TTY exec /sbin/mingetty $TTY usage 'tty TTY=/dev/ttyX - where X is console id'
getty进程打开终端并提示用户登录:
              Ubuntu 12.04.1 LTS initroot tty1
 
              initroot login: root
              Password:
            
getty进程打开终端后,首先显示/etc/issue文件中的内容,上面的第一行来自/etc/issue文件, Ubuntu 12.04.1 LTS为Ubuntu的版本号,initroot为计算机主机名称,tty1为登录的控制终端名。 系统管理员可以通过编辑/etc/issue文件自定义该部分内容的显示。

接下来getty会要求用户输入用户名和密码。输入用户名后会出现password提示输入密码. 第二行initroot login提示用户输入用户名,initroot为主机名,login提示用户输入用户名。
getty接收用户输入后启动login进程,并将用户输入的用户名参数传递给login进程。
login进程的可执行程序文件一般为/usr/bin/login,login接收getty传来的用户名参数,并提示用户输入密码。
login不会将密码明文显示到屏幕。
之后login对用户名进行分析:
如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。 这通常用来系统维护时防止非root用户登录。
只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。 /etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录、使用何种shell。
如果没有指定主目录,将默认为根目录;
如果没有指定shell,将默认为/bin/bash。

login通过读取用户账号文件/etc/passwd和/etc/shadow,验证用户输入的用户名和密码是否匹配,登录成功后显示如下界面:

                Last failed login: Mon Dec 30 20:39:54 CST 2019 from 168.181.11.252 on ssh:notty
                There were 14 failed login attempts since the last successful login.
                Last login: Fri Dec 27 11:38:54 2019 from 61.177.142.236

                Welcome to Alibaba Cloud Elastic Compute Service !

                [root@initroot ~]#
            
login验证成功后,会向对应的终端输出最近一次登录的信息(在/var/log/lastlog中有记录), 并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。
login首先显示一些账号登录的日志信息(/var/log/lastlog文件记录),包括本账号上一次登入系统的时间、终端机、登录失败信息。
这几行信息需要特别留意,如果有人在你不知情的情况下登录过你的账号,那么这里显示的信息就可能和你预期的不太一样。

显示完登录日志信息后,login进程最终会启动bash进程。 bash进程首先会读取并显示/etc/motd文件中的内容,该文件并不一定存在,可以手动创建,该文件中一般会有一些登录欢迎信息。
系统管理员可以通过编辑该文件自定义登录欢迎信息,这里建议写一些警告提示类信息。
显示完/etc/motd文件信息后,bash就会显示自己的命令行提示符,如上面的最后一行所示,即为bash的命令行提示符。此时用户就可以在命令行输入命令了。
对于bash来说,系统首先寻找/etc/profile脚本文件并执行;
然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后, 各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了.

综上,linux登录大体经过以下几个步骤:

1.getty进程打开终端,读取并显示/etc/issue文件;
2.getty进程提示用户输入用户名,启动login进程,并将用户名参数传递给login进程;
3.login进程提示用户输入密码口令;
4.login进程读取用户账号文件/etc/passwd和/etc/shadow,验证用户输入的用户名和密码是否匹配;
5.如果用户名和密码不匹配,login进程重新提示用户输入;
6.如果用户名和密码匹配,表明登录成功,login进程显示用户登录日志信息;
7.login进程启动bash进程;
8.bash进程读取并显示/etc/motd文件;
9.bash读取相关配置文件,最后显示命令行提示符,用户即成功进入linux的命令行界面。
由上可知,登录过程涉及几个重要的进程,getty、login和bash进程。
linux的登录功能由getty和login进程提供,我们甚至可以在登录成功后, 再次运行login命令进行登录,通过whereis login命令可以看到login的可执行程序文件为/bin/login或者/usr/bin/login。
bash进程由login进程启动,是用户成功登陆后启动的第一个进程,bash作为linux命令行的提供者,此时的bash进程即为交互式登录shell。 是linux下最常用的shell,此后用户和linux的交互就是通过这个bash进行。
关于bash的更多信息参考:
bash shell linux shell运行模式
登录过程中还涉及到四个重要的系统文件,其中/etc/passwd和/etc/shadow文件为系统账号管理相关文件。 关于这两个文件可以参考:账号管理相关的系统文件
/etc/issue和/etc/motd文件分别是登录前和登录后会显示的文件。/etc/issue文件在登录前由login进程读取并显示, 而/etc/motd文件则在用户成功登录后由bash进程读取并显示。 系统管理员可以通过编辑这两个文件自定义登录过程的显示信息。

2./etc/issue文件和/etc/issue.net文件

回到顶部

/etc/issue文件在用户登录前由login进程读取并显示, /etc/issue文件内容如下所示:

              [root@initroot ~]# cat /etc/issue
              \S
              Kernel \r on an \m
            
以上以CentOS环境作为示范,默认有三行,该文件中有一些转义字符,例如\r和\m, 有点类似$PS1变量中的转义字符。
通过man issue配合man agetty我们可以得到/etc/issue文件中各种转义字符的含义:
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级(i386/i486/i586/i686...);
\n 显示主机的网络名称;
\O 显示domain name;
\r 操作系统的版本(相当于uname -r);
\t 显示本地端时间的时间;
\S 操作系统的名称;
\v 操作系统的版本。
例如我们希望登录画面显示如下:
                CentOS Linux 7 (Core) (terminal: tty1)
                Date: 2015-07-08 17:29:19
                Kernel 3.10.0-229.el7.x86_64 on an x86_64
                Welcome!
            
注意,tty1显示为登录的tty终端代号,会随着登录终端的不同而不同,日期则是再按下enter后就会所有不同。
我们以root身份通过vim编辑/etc/issue文件:
              [peter@initroot ~]# sudo vim /etc/issue
                \S (terminal: \l)
                Date: \d \t
                Kernel \r on an \m
                Welcome!
              
注意文件最后还有一个空行。
除了/etc/issue文件外还有个/etc/issue.net文件!该文件由远程登录程序telnet读取。 当用户使用telnet连接到主机时,主机的登入画面就会显示/etc/issue.net而不是/etc/issue!

3./etc/motd文件

回到顶部

/etc/issue文件在登录前由login进程读取并显示, 而/etc/motd文件则在用户成功登录后由bash进程读取并显示。 系统管理员可以通过编辑该文件,将一些警告信息告知登录用户。 例如告知登录用户谨慎操作,不要删库跑路以及系统的维护时间等信息。
以root身份编辑/etc/motd文件:

              [root@initroot ~]# sudo vim /etc/motd
              Hello guy,Welcome to initroot Cloud Elastic Compute Service !
              Our server will be maintained at 2020/06/09 0:00 ~ 24:00.
              Please don't login server at that time. 
              be careful not to be fool,
              have nice time.
            
当用户(包括root)登入主机后,就看到这些信息:
              Last login: Fri Feb 28 21:31:13 2020 from 223.64.148.49
              Hello guy,Welcome to initroot Cloud Elastic Compute Service !
              Our server will be maintained at 2020/06/09 0:00 ~ 24:00.
              Please don't login server at that time. 
              be careful not to be fool,
              have nice time.
            

4.使用普通账号登录

回到顶部

在Linux系统下最好使用普通账号登录。
系统管理员账号root具有系统最高权限,任何操作都不会受到限制, root可以删除任何一个文件和目录,这是运维工作中非常危险的动作。
一旦误删除重要文件,轻则造成系统崩溃,重则导致企业重要数据财产丢失而导致破产!
这并不是危言耸听,而是实际发生的事情!
作为一名光荣合格的linux系统管理员,一定要恪守职业操守,谨慎操作,千万不能删库跑路啊!
通常系统管理员都会有一个普通账号,平时以普通账号登录Linux主机。
需要用到root权限的时候就在命令的前面加上sudo,以临时root身份执行命令。
或者用su命令切换到root身份。
关于帐号管理更多内容参考:linux用户管理

initroot原创,转载请注明出处www.initroot.com技术交流群:59909790