问题:通过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。

那么,到底两者的区别在哪里?

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命令的简单帮助:

[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"之类的命令。

  另外还有三个提示:

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://blog.sina.com.cn/s/blog_59c0a56201016im6.html

最新文章

  1. python-generator生成杨辉三角
  2. powerDesigner 报Unable to connect SQLState=08004 解决方法
  3. Ajax与用户交互的存储格式JSON
  4. 2016年11月13日 星期日 --出埃及记 Exodus 20:4
  5. shell脚本摘要
  6. Qt4升级Qt5注意问题
  7. WPF 分页控件 WPF 多线程 BackgroundWorker
  8. 关于Cookie跨域操作的一些总结
  9. winform Execl数据 导入到数据库(SQL) 分类: WinForm C# 2014-05-09 20:52 191人阅读 评论(0) 收藏
  10. 《Spring敲门砖之基础教程第一季》 第一章 概要介绍
  11. jquery知识点积累
  12. (89c51)16x16点阵屏幕的实现
  13. Linux lsof命令详解和使用示例【转】
  14. 关于oracle数据库(5)增删改查
  15. JSP servlet的配置与使用
  16. nginx session 配置失效解决
  17. 三方面搞定http协议之“请求方法”
  18. 基于MMSE的预测
  19. PhotoShop 常用快捷键
  20. 06SVM线性不可分时scikit-learn实现

热门文章

  1. Base 128 Varints 编码(压缩算法)
  2. 茅坑杀手与Alias Method离散采样
  3. 【JavaWeb】i18n 国际化
  4. 【Flutter】功能型组件之数据共享
  5. Educational Codeforces Round 102 (Rated for Div. 2)
  6. alter column和modify column
  7. drop table 命令不回收以前的相关访问权限
  8. CSRF - Pikachu
  9. openpose c++ 配置教程 + python api
  10. LOOP语句的AT语句块