Linux下Login和Logout详解
Login 是你用Linux系统工作时面对的第一个进程,这对于使用终端以及通过网络使用Linux都是正确的。但是login进程本身并不是你在终端上见到的,你见到的其实是getty (get TeleTYpe terminal ,早期电脑上的意思是获取纸带终端,现在可以直接理解成打开终端),它是由init(通过/etc/inittab)在启动login进程时添加而启动的。
所以完整的启动链是:init -> getty -> login -> passwd -> shell -> applications 。这是从技术上来讲的在真正实现时还是有点不同的,比如有时候login和passwd是在一个程序里面,但是上面这个链是UNIX中很典型的。
那么为什么我们要这么做?为什么不能写一个程序来处理所有的工作。让一个getty程序同时处理login和passwd不好么?
让一个程序只做一件简单的事然后链接许多简单的工作创造了这个复杂的运行环境,这是保证UNIX稳定的关键,而且当你创造你的系统时这也是一个很关键的设计准则。(参见KISS准则,UNIX中的经典)
Debian6上默认提供六个终端(Ctrl+Alt+F1~F6,因为F7,F8用来打开图形界面而不是用作终端),但是实际上内核默认是64个终端,那么其他的终端哪去了?假如你在Linux虚拟机上,你可以访问tty10甚至tty12(使用Ctrl+Alt+F*),但是你没有更多的功能键,以后我们在讨论如何访问其他的终端。
Logout 进程
logout进程很简单,他需要终止login进程打开的任务或者shell。注意,它要关闭的不只是一个shell,而是所有的东西。
假如我使用long作为用户登录我会得到一个shell,假如我使用 ls,我会得到ls的结果然后我logout。所以logout的shell会发送一个信号到父进程用来通知它shell被终止了。但是shell的父进程是 login 而且此时 login 已经停止运行了(logout会终端login和shell),那么谁来获取shell的返回值呢? 是 init 来接受 logout 的返回值,在关闭getty、login、logout等所有后,init 重新打开一个getty来等待输入。
下面我们看个好玩的东东:
-rwxr-xr-x 1 root root 975488 Dec 29 2012 /bin/bash
-rwxr-xr-x 1 root root 49008 May 25 2012 /bin/login
-rwxr-xr-x 2 root root 32040 Dec 11 2012 /sbin/getty
-rwsr-xr-x 1 root root 51096 May 25 2012 /usr/bin/passwd
我们都可以看到,除了passwd其他都有着rwxr-xr-x权限,所有他们可以被任何用户执行,而passwd是-rwsr-xr-x权限,这个s是setuid的标志,该位是让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令,所以passwd是运行在root权限下(即使是一个普通用户使用)。有了这个,我们可以降低安全风险。
Login配置
你使用login登录,你不但打开了一个shell而且还配置了你的运行时环境(runtime env),这个配置如果在/etc下是系统级别的配置,如果在你的个人home目录下则是个人配置。
大概划分是这样的:
/etc/profile - 面向所有的用户和所有的shell
/etc/bash.bashrc - 面向所有用户的bash配置
~/.bashrc - 你个人的bash配置
所以在实际使用时我们需要根据需求的不同将配置放在不同的配置文件中。比如说,一个配置对所有使用这个系统的用户都有用,我们就需要放在/etc/profile下。
su
提到用户登录,这里说下root权限,使用su命令(su -)你不但切换了用户权限而且你创建了一个新的login会话,所以你得到的不只是一个root,而且是一个全新的运行时环境,这对于安全问题来说是很敏感的,所以使用root权限是一定要注意。当然,你也可以使用sudo来让自己的用户临时获得root权限,这对于桌面用户来说还是个不错的方法,但是对于比较大的系统,给用户sudo权限一定要注意,最好不给!
Exit vs logout
使用login登陆系统,那么退出系统我们可以选择exit或者logout,那么这两者之间有区别么?大部分系统来说这两者之间是没有区别的,但是他们两者还是有一点点的区别的:logout退出时会执行~/.bash_logout(如果有的话),而exit只会作退出工作而不执行~/.bash_logout。除此之外别无其他区别。