1. 程式人生 > 實用技巧 >linux下 su & su - & sudo命令對環境變數造成的影響 & 設定環境變數

linux下 su & su - & sudo命令對環境變數造成的影響 & 設定環境變數

  首先講講背景吧,我首先是遇到了一個問題,那就是在編譯中我發現,當我使用sudo ./bash_create.sh(bash_create呼叫了cmake) 編譯會報錯。而當我使用su切換到root時,編譯能通過不會報錯。然後我便分別用root和普通使用者測試了一下使用sudo和不使用sudo命令的情況,結果如下:

可以看到,無論是root還是ghs(普通使用者)在使用cmake --version時顯示的cmake版本都是3.0.0,而在使用sudo後都將顯示2.8.12版本。這就奇怪了,因為一直以來,我都是將sudo命令當作短暫將普通使用者提為root使用者的一個命令,那麼sudo後應該和root直接看version是一樣的。

  所以既然出現了這種情況,說明sudo可能並不僅僅是提升許可權,還加了一些限制。


  當然,在探索sudo的性質之前,要了解一些基礎的知識。我們知道,在安裝cmake/gcc之類的軟體後,系統中便直接可以使用cmake/gcc的命令。為什麼能達到這種效果呢?這是因為,這些軟體在安裝時一般被安裝在/usr/bin這種目錄下面,而如/usr/bin這種目錄一般會被加入到root/使用者的環境變數,所以在使用命令時系統會在環境變數中找到這個命令,並使用。我們所使用的系統命令如ls/pwd/reboot,實際上也是被加入了資料夾後然後將這個資料夾目錄加入環境變數,這種之後便成為了我們日常所使用的“命令”。

如此介紹之後,我們應該知道了環境變數的重要性,系統無論是使用全域性命令或是軟體都依賴於環境變數的新增。

  在介紹了環境變數的重要性後,我們要知道的是不同使用者的環境變數的配置是不同(這是很自然的,畢竟不同的使用者安裝了不同的軟體,需要不同的全全域性命令)。那麼我們如何設定&檢視環境變數呢?

  首先,環境變數也有著不同的級別,有的環境變數是針對於系統的環境變數,而有的環境變數是針對於使用者的,具體看:

/etc/profile:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行。並從/etc/profile.d目錄的配置檔案中搜集shell的設定。

/etc/bashrc:為每一個執行bash shell的使用者執行此檔案.當bash shell被開啟時,該檔案被讀取.

~/.bash_profile:每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案.

~/.bashrc:該檔案包含專用於你的bash shell的bash資訊,當登入時以及每次開啟新的shell時,該檔案被讀取.

~/.bash_logout:當每次退出系統(退出bash shell)時,執行該檔案.

(另外,/etc/profile中設定的變數(全域性)的可以作用於任何使用者,而~/.bashrc等中設定的變數(區域性)只能繼承/etc/profile中的變數,他們是"父子"關係)

  可以看到環境變數也是個複雜的系統。但實際使用中我們只需要檢視一些簡單而有效的環境變數便可以了,這時我們只需使用 echo $PATH命令便可以顯示當前環境的環境變數。


  在瞭解了環境變數我們自然想檢視不同使用者的環境變數,比如說root使用者和普通的使用者的環境變數,如下圖:

看到好像兩者是一樣的,那麼你就上當了,這就是第一個坑。

su & su -

  一般來說,我們登陸的是普通使用者,然後使用su命令切換成root使用者。但是從普通使用者切換成root使用者的方式卻是有兩種的,

使用su不加任何引數,預設是切換到root使用者,不變環境變數

使用su – 普通使用者切換到root使用者,改變環境變數

這種設計的目的就是為了能夠更好的銜接使用者使用的環境,因為一般來說使用者即使切換到root後依然有可能使用在原來環境變數下使用的一些命令&軟體,這樣的設計令使用者不會有一種切到root後好像有一些軟體使用不了的情況出現。當然,如果一直使用su命令也會有問題,因為環境變數不變意味著你環境的配置或是軟體的安裝都是和普通使用者一樣,除了許可權不同,那麼在一些需要應用在全域性(所有使用者)的情況就會產生問題。

可以看到兩個環境變數是不同的。


su&su -&sudo

  在瞭解了一大堆前置知識後,我們終於可以解決使用sudo命令後顯示不同的問題了。我們可以想到,應該是使用了sudo命令後環境變數不同的關係。那麼,說明sudo命令所使用的環境變數既不是普通使用者的環境變數又不是root使用者的環境變數。

  實際上,sudo命令使用時將PATH環境變數進行了重置,這實際上是一種安全性的考慮,目的顯然是要限制使用者執行 sudo 命令的範圍,這是一種好做法。

我們可以使用 sudo visudo 命令(vi /etc/sudoers)修改檔案。在secure_path可以看到sudo所設定的PATH環境變數:(這裡有個冷知識:usr指的不是user而是Unix System Resource

我們和前面普通使用者&root的環境變數進行對比:

我們一個個目錄找過來,發現在普通使用者&root的環境變數中在/usr/local/bin最早出現cmake,而在sudo的環境變數中在/bin中最早出現cmake

在/usr/local/bin中cmake版本都是3.0.0

而在/usr/bin中cmake版本是2.8.12

綜上,su & su - & sudo命令所使用的環境變數的不同造成了這種問題。

對sudo想有進一步瞭解可以看:Developer