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

 而在/bin中cmake版本是2.8.12

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM