linux登录和自定义登录信息
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