login shell and nonlogin shell

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

1
2
3
4
5
      
      
[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文件。
接下来在此想彻底理清bash的login shell与non-login shell
说老实话,到现在我还没用过login shell(没用过tty1~tty6的文字登入模式啦),也就是说,都是在X介面下启动的终端而已,所以基本都是non-login shell~~

定义:
loginshell:取得bash 时需要完整的登入流程,就称为loginshell。举例来说,同tty1~tty6登入时, 
需要输入用户名和密码,此时取得的bash就称为login shell

non-loginshell:取得bash介面的方法不需要重复登入的动作。
举两个例子(1)以X window登入linux后,再以X的图形化介面启动终端机,此时那个终端机并不需要再次的输入用户名和密码,那个bash的环境就称为non-loginshell
(2)在原本的bash环境中再次下达bash这个指令,同样没有要求输入用户名和密码,那个第二个bash也是non-loginshell


在这两个取得bash的情况中,所读取的设定档并不一样(以下引用鸟哥)

login shell 其實只會讀取這兩個設定檔:
  1. /etc/profile:這是系統整體的設定,你最好不要修改這個檔案;
  2. ~/.bash_profile 或 ~/.bash_login 或~/.profile:屬於使用者個人設定,你要改自己的資料,就寫入這裡
/etc/profile只有loginshell会读,每個使用者登入取得 bash時一定会读取的设定档!所以如果你想要帮所有使用者设定整体环境,那就是改这里
同样, /etc/profile会去呼叫外部的设定资料,底下这些资料会 依次被呼叫进来:(底下引自鸟哥)

/etc/inputrc:其實這個檔案並沒有被執行啦!/etc/profile會主動的判斷使用者有沒有自訂輸入的按鍵功能,如果沒有的話, /etc/profile就會決定設定『INPUTRC=/etc/inputrc』這個變數!此一檔案內容為 bash的熱鍵啦、[tab]要不要有聲音啦等等的資料! 因為鳥哥覺得 bash 預設的環境已經很棒了,所以不建議修改這個檔案!

/etc/profile.d/*.sh:其實這是個 目錄內的眾多檔案!只要在 /etc/profile.d/這個目錄內且副檔名為 .sh ,另外, 使用者能夠具有 r的權限,那麼該檔案就會被 /etc/profile 呼叫進來。在CentOS 5.x 中,這個目錄底下的檔案規範了 bash 操作介面的顏色、 語系、ll 與 ls 指令的命令別名、vi的命令別名、which 的命令別名等等。如果你需要幫所有使用者設定一些共用的命令別名時, 可以在這個目錄底下自行建立副檔名為 .sh的檔案,並將所需要的資料寫入即可喔!

/etc/sysconfig/i18n:這個檔案是 由/etc/profile.d/lang.sh 呼叫進來的!這也是我們決定 bash預設使用何種語系的重要設定檔!檔案裡最重要的就是 LANG 這個變數的設定啦

反正你只要記得, bash的 login shell 情況下所讀取的整體環境設定檔其實只有 /etc/profile ,但是 /etc/profile還會呼叫出其他的設定檔,所以讓我們的 bash 操作介面變的非常的友善啦


个人设定:

~/.bash_profile ( login shell 才會讀)

bash 在讀完了整體環境設定的 /etc/profile 並藉此呼叫其他設定檔後,接下來則是會讀取使用者的個人設定檔。在 login shell 的 bash環境中,所讀取的個人偏好設定檔其實主要有三個,依序分別是:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

其實 bash 的 login shell設定只會讀取上面三個檔案的其中一個, 而讀取的順序則是依照上面的順序。也就是說,如果~/.bash_profile 存在,那麼其他兩個檔案不論有無存在,都不會被讀取。 如果 ~/.bash_profile不存在才會去讀取 ~/.bash_login,而前兩者都不存在才會讀取 ~/.profile 的意思。會有這麼多的檔案,其實是因應其他shell 轉換過來的使用者的習慣而已
bash 設定檔的讀入方式比較有趣,主要是透過一個指令『 source 』來讀取的! 也就是說 ~/.bash_profile其實會再呼叫 ~/.bashrc 的設定內容喔,login shell 環境下,最終被讀取的設定檔是『 ~/.bashrc』這個檔案

~/.bashrc (non-login shell 會讀)
談完了 login shell 後,那麼 non-login shell 這種非登入情況取得 bash 操作介面的環境設定檔又是什麼?當你取得 non-login shell 時,該 bash 設定檔僅會讀取~/.bashrc 而已啦
不过~/.bashrc会去呼叫/etc/bashrc.而这个/etc/bashrc主要有三个作用“
1.根据不同的UID,规范出UMASK的值
2.依据不同的UID ,规范出PS1, 也就是提示符的内容
3.呼叫/etc/profile.d/*sh目录中的内容


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值