1. 程式人生 > >login shell和nologin shell的區別以及su和su

login shell和nologin shell的區別以及su和su

Login shellnologin shell的區別

說下定義,其實很好理解。Login shell就是你進入shell是需要輸使用者名稱密碼的,比如你啟動圖形介面最後一步需要你輸入使用者名稱密碼,只有你輸入正確,才能進入桌面,這進入的就是一個login shell。另外比如你crtl + alt + F2等進入非圖形介面的tty,都是需要你輸入使用者名稱密碼之後才能繼續操作,這種情況下你進入的就是login shell

nologin shell就是你不需要輸入密碼就能進入的shell。比如你進入圖形介面之後,右鍵開啟終端,就直接打開了一個承載shell的終端,在這個終端中你不用輸入使用者名稱密碼就直接可以使用命令。明白了吧,這就是

login shellnologin shell的區別。

這是表面上的區別,其實真正影響這兩種shell使之不同的是開啟兩者所讀取的環境變數檔案不同。

Login shell 讀取的檔案和順序:

/etc/profile     #這是系統的預設環境變數檔案,所有使用者都讀取此檔案

/etc/bashrc    

~/.bashrc

~/.bash_profile

Nologin shell 讀取的檔案和順序為:

/etc/bashrc

~/.bashrc

這個結果是我通過實驗測出來的,沒有正式的文件參考。實驗使用的rhel5.4,測試方法是在這些檔案寫入同一個變數,但給在不通檔案中的變數賦不通的值,比如在/etc/profile

檔案中寫入export  TEST=/etc/profile,在/etc/bashrc中寫入export  TEST=/etc/bashrc,由於讀取檔案順序的原因,後讀取檔案中的變數內容會覆蓋之前讀取檔案中的變數內容,這樣,登陸一個login shell,輸出TEST變數echo $TEST。然後通過把當前生效的檔案的改行註釋掉,再次檢視變數輸出資訊。這樣就能得到讀取檔案的逆序。

我們知道系統的shell種類其實有許多的,除了bash之外還有kshcsh等。

/etc/profile是所有系統登入時要讀取的變數檔案,無論你要開啟的是哪一種的shell

/etc/bashrc是當你登陸的使用者使用bash登陸時讀取的變數檔案。

同時,/etc/profile/etc/bashrc中的設定對系統的所有使用者具有同等效用。而~/.bashrc~/.bash_profile是為某一具體使用者設定具體的環境變數引數的檔案,只對特定的使用者有效。

而我們知道nologin shell一定是在已經登入了login shell的前提下開啟的,比如字元視窗startx啟動圖形介面,或者圖形介面裡開啟新的終端。所以nologin shell算是login shell的一個子程式,根據shell中變數的繼承法則,nologin shell會在繼承原本login shell所有的環境變數的基礎上讀取~/.bashrc中的引數。

這就是這些個檔案所有的關係了。所以有的時候,你設定的環境變數並沒有生效,可以根據這個讀取順序檢視一下是不是你的設定被覆蓋掉了……

說兩個命令:

Chsh  /bin/csh(某一種shell的路徑)

可以改變某使用者的預設shell。注意,每一個使用者對應一個預設shell。並不是對系統所有使用者都生效。

Source  /etc/profile

可以使/etc/profile檔案中的更改內容及時生效。

具體使用

論壇上有人想讓每次系統啟動之後就自動開啟bash

這個時候你就可以再/etc/profile檔案中加入一下語句

Gnome-terminal &

如果你想每次開啟一個nologin shell都顯示當前目錄,

就可以直接將pwd加入/etc/bashrc檔案中。

如果你想每次開啟一個nologin shell都自動進入/etc目錄,

就可以直接將cd  /etc加入到/etc/bashrc檔案中。

如果你想在某一個使用者登入的時候才有這樣的功能,則直接在該使用者根目錄更改/.bash_profile或者/.bashrc就可以實現了。

還有就是如果你的命令使開啟一個程式,比如firefox,這樣在你的firefox退出之前,就不能進行其他作業了,這種情況下,你最好使用firefox&讓它在後臺跑。

最後

我的環境是rhel5.4。這點一定要注意,當你的系統版本不同的時候,你也許發現我說的檔案在你的系統中根本不存在,那麼你可以按照我上文的思路去好好探索下你面對的作業系統中都有哪些個檔案了。

Su su -的區別

對於su命令,只會更改當前使用者,而不會更改當前的使用者環境,比如你從oracle 使用者suroot賬戶中,當前路徑仍是你剛才的路徑,環境變數仍是oracle使用者的變數資訊。

su -命令,則在更改當前使用者資訊的同事還會更改使用者環境,如果你從oracle 使用者su -root賬戶,你會發現你的當前路徑已經變味/root/下了,環境變數也變了。這就是區別。