login shell和non-login shell

来源:互联网 发布:淘宝老板 编辑:程序博客网 时间:2024/04/30 14:35

转自:http://www.isayme.org/linux-diff-between-login-and-non-login-shell.html
今天遇到的问题,通过su命令切换用户并没有进入该用户的shell环境。这是为什么?

先介绍login shell和non-login shell概念:

  • login shell:去的bash时需要完整的登录流程。就是说通过输入账号和密码登录系统,此时取得的shell称为login shell
  • non-login shell:取得sbash接口的方法不需要重复登录的举动。如以X Window登录登录linux后,再以X的图形界面启动终端机,此时那个终端机并没有需要输入账号和密码,那个bash环境就是non-login shell。在原本的bash环境下再次执行bash命令,同样也没有输入账号密码就进入新的bash环境(前一个bash的子进程),新的bash也是non-login shell。

说了半天,那这两个shell到底有什么区别?

  • login shell:此种方式登录时,shell会重新读取/etc/profile和~/.bash_profile来应用新的环境变量。
  • non-login shell:此时shell不会读取/etc/profile和~/.bash_profile,而是读取~/.bashrc来应用新的环境变量。

话说标题是区别与影响,影响的东西自然源于区别。回到文章开头的问题,su切换用户没有获取用户的环境(当时用的命令是"su xxoo",这里xxoo为要切换的用户,以root身份执行的此命令),看来问题就在这倆login方式,根据现象我们可以判断su xxoo执行了non-login shell。

为了验证上面的判断,我们查看了su命令的简单帮助:

12345
[root@isayme ~]# su --help
Usage: su [OPTION]... [-] [USER [ARG]...]
Change the effective user id and group id to that of USER.

  -, -l, --login               make the shell a login shell

很明显,我的判断是正确的,默认情况下是执行的non-login shell,因为要执行login shell需要在su后面添加参数"-"或"-l"或"--login"。所以要在su之后获取用户的环境变量,需要执行类似"su - xxoo"之类的命令。

自此,了解了login shell和non-login shell的区别。也解决了文章开头的问题。本文按理该结束了,但我还想说:PP更精彩!

  • PS1:bash在读取/etc/profile后会读取各账户的个人配置文件,所读取的个人配置文件主要有三个:~/.bash_profile,~/.bash_login,~/.profile。其实bash在读取的时候只会读取的上述三个文件的其中一个,而读取的顺序则就是上面的顺序。也就是说bash会依次查找上述三个个人配置文件,且找到一个后,后续的文件便不再读取
  • PS2:当以non-login shell登录时,如果希望获取用户的环境变量,执行"source ~/.bash_profile"即可(.bash_profile根据情况也可能是.bash_login或.profile),而其中source可以用小数点替换,即"source ~/.bash_profile"等价于". ~/.bash_profile"。source命令的解释可以自行搜索。
  • PS3:其实有的linux发行版的login shell也会读取.bashrc文件,如Fedora11中执行 "vim ~/.bash_profile"会发现 "if [ -f ~/.bashrc ]; then . ~/.bashrc fi"。这里就使用了PS2的提到的用小数点替换source特性,即在./bash_profile会读取执行.bashrc文件。

转自:http://hi.baidu.com/ladybeta/item/43549ad114446f1820e250a2
两种不同的配置概念 profile, 和rc。 rc是什么的缩写,我也不知道?
我们知道当在shell里面运行应用程序的时候,表现形式会受到配置参数的影响,最主要的是一些path,或者shell本身的配置。而linux的配置 一般分成两种,一种是profile,另一种是rc。profile是和用户和机器配置相关的,比如USERNAME,HOSTNAME或者HOME。而 rc则是主要负责一些和路径等和运行时更相关的参数,最主要的是PATH。

在第一次用户login的时候,就会初始化profile相关的脚本,这就是所谓的login shell。当在已经存在的shell里面启动另外一个shell的时候,比如使用"bash"或者"su",启动的这个新shell就会初始化rc相关 的脚本。这个shell就称为non-login shell。

login shell会执行的脚本通常有 /etc/profile和~/.bash_profile。
non-login shell会执行的脚本通常有/etc/bashrc (在Ubuntu Jaunty 上是/etc/bash.bashrc)和~/.bashrc


在tty下login进去,得到的是一个login shell。之后使用bash或者su命令得到的是non-login shell。而在Ubuntu Jaunty下的GNOME用terminal启动出来的shell是non-login shell。退出该non-login shell的话,只需要exit即可。在所有的shell中,子shell继承父shell的env环境变量。但是要注意env的初始创建和shell并 没有什么关系。
原创粉丝点击