su 命令
su
su命令的主要作用是讓你可以在已登錄的會話中切換到另外一個用戶。換句話說,這個工具可以讓你在不登出當前用戶的情況下登錄為另外一個用戶。
su命令經常被用於切換到超級用戶或 root 用戶(因為在命令行下工作,經常需要 root 權限),但是 - 正如前面所提到的 - su 命令也可以用於切換到任意非 root 用戶。
如何使用 su 命令切換到 root 用戶,命令:su 不帶參數。
su 命令要求輸入的密碼是 root 用戶的密碼。所以,一般 su 命令需要輸入目標用戶的密碼。在輸入正確的密碼之后,su 命令會在終端的當前會話中打開一個子會話。
su -
還有一種方法可以切換到 root 用戶:運行 su - 命令,如:su - 可提供的環境為用戶在直接登錄時的環境
那么,su 命令與 su - 命令之間有什么區別呢?前者在切換到 root 用戶之后仍然保持舊的(或者說原始用戶的)環境,而后者則是創建一個新的環境(由 root 用戶 ~/.bashrc 文件所設置的環境),相當於使用 root 用戶正常登錄(從登錄屏幕登錄)。
單純使用su切換到root,讀取變量的方式是non-login shell,這種方式下很多的變量都不會改變,尤其是PATH,所以root用的很多的命令都只能用絕對路徑來執行,這種方式只是切換到root的身份。而用su -這種方式的話,是login shell方式,它是先以root身份登錄然后再執行別的操作。
[devdeploy@CTU1000094641 ~]$ su 單純的su切換用戶 Password: [root@CTU1000094641 devdeploy]# pwd pwd沒有改變 /home/devdeploy [root@CTU1000094641 devdeploy]# echo $PATH PATH沒有改變 /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/biz/maas/java/bin:/home/devdeploy/bin [root@CTU1000094641 devdeploy]# exit exit 顯示為exit [devdeploy@CTU1000094641 ~]$ su - 以root身份登錄方式 Password: [root@CTU1000094641 ~]# pwd pwd是進入到root的主文件夾下 /root [root@CTU1000094641 ~]# echo $PATH PATH已經改變 /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/biz/maas/java/bin:/root/bin [root@CTU1000094641 ~]# exit logout 顯示為logout
關於 su 命令的好處和壞處:
有的時候,對於系統管理員(root)來講,使用其他普通用戶的 Shell 賬戶而不是自己的 root Shell 賬戶更會好一些。尤其是在處理用戶問題時,最有效的方法就是是:登錄目標用戶以便重現以及調試問題。
然而,在多數情況下,當從普通用戶切換到 root 用戶進行操作時,如果還使用普通用戶的環境變量的話,那是不可取甚至是危險的操作。因為是在無意間切換使用普通用戶的環境,所以當使用 root 用戶進行程序安裝或系統更改時,會產生與正常使用 root 用戶進行操作時不相符的結果。例如,以普通用戶安裝程序會給普通用戶意外損壞系統或獲取對某些數據的未授權訪問的能力。
注意:如果你想在 su - 命令的 - 后面傳遞更多的參數,那么你必須使用 su -l 而不是 su -。以下是 - 和 -l 命令行選項的說明:
-, -l, --login
提供相當於用戶在直接登錄時所期望的環境。
當使用 - 時,必須放在 su 命令的最后一個選項。其他選項(-l 和 --login)無此限制。
su -c
還有一個值得一提的 su 命令行選項為:-c。該選項允許你提供在切換到目標用戶之后要運行的命令。su 命令手冊頁是這樣說明:
-c, --command COMMAND使用 -c 選項指定由 Shell 調用的命令。被執行的命令無法控制終端。所以,此選項不能用於執行需要控制 TTY 的交互式程序。
參考示例:
su [target-user] -c [command-to-run]
示例中,command-to-run 將會被這樣執行:
[shell] -c [command-to-run]
示例中的 shell 類型將會被目標用戶在 /etc/passwd 文件中定義的登錄 shell 類型所替代。
sudo命令
相比於su切換身份需要用戶的密碼,經常性的是需要root密碼,sudo只是需要自己的密碼,就可以以其他用戶的身份來執行命令,經常是以root的身份執行命令,也並非所有人都可以用sudo。
[root@CTU1000094955 ~]# sudo head -n 3 /etc/shadow root:$6$pr.H./1G$nENhNZTk0gs9i4XvTL98JRg99doxoKgYfh2AN7HXkWGs1.rVplfQwQ1gSiUbVF4kuZxM5/BEXbr5q6EsrmC75.:17438:0:99999:7::: bin:*:16659:0:99999:7::: daemon:*:16659:0:99999:7::: [root@CTU1000094955 ~]# head -n 3 /etc/shadow head: cannot open '/etc/shadow' for reading: Permission denied
sudo是依賴於/etc/sudoers這個配置文件的。sudo的執行有這樣一個流程:
1).當用戶執行sudo時,系統於/etc/sudoers文件中查找該用戶是否有執行sudo的權限;
2).若用戶具有可執行sudo的權限,那么讓用戶輸入用戶自己的密碼,注意這里輸入的是用戶自己的密碼;
3).如果密碼正確,便開始進行sudo后面的命令,root執行sudo是不需要輸入密碼的,切換到的身份與執行者身份相同的時候,也不需要輸入密碼。
下面看看/etc/sudoers這個配置文件:
## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## Syntax: ## ## user MACHINE=COMMANDS ## ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
為何剛開始只有root能執行sudo,切換到root身份通過visudo查看/etc/sudoers這個配置文件,如果是vim /etc/sudoers是可以查看的,但是不能修改,因為sudoers這個文件是有語法的,只能通過visudo來修改。第一處紅色那行代碼,這行代碼第一列root是用戶賬號,第二列的ALL意思是登陸者的來源主機名,第三列等號右邊小括號中的ALL是代表可以切換的身份,第四列ALL是可執行的命令。
1).單個用戶的sudoers語法:
如果我要我當前這個用戶能執行root的所有操作,那么我只要加一行learnpython ALL=(ALL) ALL。那么如果有很多人需要執行sudo,那不是要寫編寫很多行啊,這樣不是很麻煩,這樣就要用到用戶組了。
2).利用用戶組處理visudo:
看看第二處紅色那行代碼,%wheel代表wheel用戶組,如果我們將需要執行root所有操作的用戶都加入到wheel用戶組,或者我們自定義的用戶組,然后添加一行代碼,那么就不用一個用戶一個用戶的添加進來了,這樣不是很省事啊。
3).限制用戶sudo的權限:
經常我們不需要用戶有那么大的權限,只要讓他們具有他們負責范圍的權限就可以了,比如有的有的人來管理密碼,我們就只讓他能進行密碼的管理,而不讓他有別的權限,這樣就需要權限的控制了。如果我讓我當前用戶來管理密碼,即learnpython這個用戶能使用passwd這個命令來幫root修改用戶密碼,只要加這行learnpython ALL=(root) /usr/bin/passwd,那么learnpython這個用戶就可以使用passwd這個命令了:
但是如果只是執行sudo passwd命令,修改的就是root的密碼,當然我們不希望普通用戶能具有修改root密碼的權限,那么在visudo的時候就需要將命令的參數限制好,如改成這樣:
[root@localhost ~]# visudo learnpython ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
4).通過別名設置visudo
查看sudoers這個文件的時候,你會看見User_Alias,Host_Alias和Cmnd_Alias這些東西,他們都是一些別名,User_Alias表示具有sudo權限的用戶列表,就是第一列參數,Host_Alias表示主機的列表,就是第二列參數,Cmnd_Alias表示允許執行命令的列表,就是第四列參數,還有個Runas_Alias,我初始的sudoers里是沒有的,這個表示用戶以什么身份登錄,也就是第三列參數。
所以如果有幾個密碼管理員的話就可以加上如下代碼:
[root@localhost ~]# visudo User_Alias PWMNG = manager1, manager2, manager3 Cmnd_Alias PWCMD = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root PWMNG ALL=(root) PWCMD
5).sudo搭配su
從上面來看,我們都只是切換到別的用戶然后執行命令,接着就切回到我們自己的用戶了,如果我們要像su那樣直接切換到root,然后干自己想干的,這個時候,就要將命令修改成/bin/su -,如下:
[root@localhost ~]# visudo User_Alias ADMINS = user1, user2, user3 ADMINS ALL=(root) /bin/su -
當然這個是需要慎重了,因為這樣用戶user1,user2,user3等就直接切換到root了,切換后他們就是老大了。
當我們連續使用sudo的時候,在一定時間內是不用再次輸入我們的密碼,這個其實是系統自己設定的,在五分鍾之內執行sudo只需要輸入一次密碼就可以了。
sudo和su區別聯系
兩個命令的最大區別是:sudo 命令需要輸入當前用戶的密碼,su 命令需要輸入 root 用戶的密碼。
1、就安全而言:sudo 命令更好。例如,考慮到需要 root 訪問權限的多用戶使用的計算機。在這種情況下,使用 su 意味着需要與其他用戶共享 root 用戶密碼,這顯然不是一種好習慣。
如果要撤銷特定用戶的超級用戶/root 用戶的訪問權限,唯一的辦法就是更改 root 密碼,然后再告知所有其他用戶新的 root 密碼。
鑒於 sudo 命令要求輸入的是其他用戶自己的密碼,所以,不需要共享 root 密碼。同時,想要阻止特定用戶訪問 root 權限,只需要調整 sudoers 文件中的相應配置即可。
2、就默認行為而言:sudo 命令只允許使用提升的權限運行單個命令。而 su 命令會啟動一個新的 shell,同時允許使用 root 權限運行盡可能多的命令,直到明確退出登錄。
因此,su 命令的默認行為是有風險的,因為用戶很有可能會忘記他們正在以 root 用戶身份進行工作,於是,無意中做出了一些不可恢復的更改(例如:對錯誤的目錄運行 rm -rf 命令!)。
3、就日志記錄而言:盡管 sudo 命令是以目標用戶(默認情況下是 root 用戶)的身份執行命令,但是它們會使用 sudoer 所配置的用戶名來記錄是誰執行命令。而 su 命令是無法直接跟蹤記錄用戶切換到 root 用戶之后執行了什么操作。
4、就靈活性而言:sudo 命令比 su 命令靈活很多,因為你甚至可以限制 sudo 用戶可以訪問哪些命令。換句話說,用戶通過 sudo 命令只能訪問他們工作需要的命令。而 su 命令讓用戶有權限做任何事情。
大概是因為使用 su 命令或直接以 root 用戶身份登錄有風險,所以,一些 Linux 發行版(如 Ubuntu)默認禁用 root 用戶帳戶。鼓勵用戶在需要 root 權限時使用 sudo 命令。
然而,您還是可以成功執行 su 命令,而不用輸入 root 用戶的密碼。運行命令:sudo su
由於你使用 sudo 運行命令,你只需要輸入當前用戶的密碼。所以,一旦完成操作,su 命令將會以 root 用戶身份運行,這意味着它不會再要求輸入任何密碼。
PS:如果你想在系統中啟用 root 用戶帳戶(強烈反對,因為你可以使用 sudo 命令或 sudo su 命令),你必須手動設置 root 用戶密碼,可以使用命令:sudo passwd root
總結
比較su和sudo,sudo有太多的好處。su方式切換是需要輸入目標用戶的密碼,而sudo只需要輸入自己的密碼,所以sudo可以保護目標用戶的密碼不外流的。當幫root管理系統的時候,su是直接將root所有權利交給用戶,而sudo可以更好分工,只要配置好/etc/sudoers,這樣sudo可以保護系統更安全,而且分工明確,有條不紊。