有這樣一種場景,當管理者通過普通使用者賬戶登入到裝置時,突然有個需求需要操作,但該普通使用者賬戶沒有這個權限。這時,管理者隻能退出裝置,重新使用root賬戶登入。然後使用完成後,重新利用普通使用者賬戶登入。這種方式無疑是繁瑣而低效的。這裡我們有兩種處理的方式。一種是線上切換賬戶,相對應的指令是su。另一種則是讓普通使用者臨時以root的身份執行操作,相對應的指令是sudo。下面我們将學習下這兩個指令的使用方式。
1、su 切換使用者賬戶,擁有該使用者賬戶的操作權限
命 令
作 用
whoami
檢視目前使用者
su user1
在切換使用者的同時,不改變環境變量
su - user1
在切換使用者的同時,将環境變量都切換到該使用者的環境變量
su -
切換到root使用者下,環境變量也變為root使用者的環境變量
su - -c "id" user1
使用user1這個賬号去執行id指令
在執行以上指令的時候,普通使用者需要切換使用者的密碼,而root使用者可以使用su切換到任何使用者下,而且不用輸入密碼。
測試示例:
<code>[root@server02 ~]</code><code># su user1</code>
<code>[user1@server02 root]$ </code><code>whoami</code>
<code>user1</code>
<code>[user1@server02 root]$ </code><code>echo</code> <code>$PATH</code>
<code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code>
<code>[user1@server02 root]$ </code><code>exit</code>
<code>exit</code>
<code>[root@server02 ~]</code><code># su - user1</code>
<code>上一次登入:二 5月 30 13:18:32 CST 2017pts</code><code>/0</code> <code>上</code>
<code>[user1@server02 ~]$ </code><code>echo</code> <code>$PATH</code>
<code>/usr/local/bin</code><code>:</code><code>/bin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/usr/local/sbin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/home/user1/</code><code>.</code><code>local</code><code>/bin</code><code>:</code><code>/home/user1/bin</code>
<code>[user1@server02 ~]$ </code><code>exit</code>
<code>登出</code>
<code>[root@server02 ~]</code><code># su - -c "id" user1</code>
<code>uid=1000(user1) gid=1000(user1) 組=1000(user1) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023</code>
su的優缺點:
su的确為管理帶來友善,通過切換到root下,能完成所有系統管理工具,隻要把root的密碼交給任何一個普通使用者,他就能切換到root來完成所有的系統管理工作。但通過su切換到root後,也有不安全因素。比如系統有10個使用者,而且都參與管理。如果這10個使用者都涉及到超級權限的運用,做為管理者如果想讓其它使用者通過su來切換到超級權限的root,必須把root權限密碼都告訴這10個使用者;如果這10個使用者都有root權限,通過root權限可以做任何事,這在一定程度上就對系統的安全造成了威協;想想Windows吧,簡直就是惡夢;“沒有不安全的系統,隻有不安全的人”,我們絕對不能保證這 10個使用者都能按正常操作流程來管理系統,其中任何一人對系統操作的重大失誤,都可能導緻系統崩潰或資料損失;是以su 工具在多人參與的系統管理中,并不是最好的選擇,su隻适用于一兩個人參與管理的系統,畢竟su并不能讓普通使用者受限的使用。超級使用者root密碼應該掌握在少數使用者手中。
2、sudo 可以讓普通使用者臨時以root的身份執行一條指令,該使用者隻需要知道自己的密碼
通過visudo指令打開sudo的配置檔案(/etc/sudoers),可以進行一些關于sudo授權的配置。如定義host、user以及指令的别名等。
<code>## The COMMANDS section may have other options added to it.</code>
<code>##</code>
<code>## Allow root to run any commands anywhere</code>
<code>root ALL=(ALL) ALL</code>
<code>user1 ALL=(root) NOPASSWD:/bin/ls,/bin/cat</code>
<code>@新增的上行中,user1表示使用者,ALL表示所有來源IP,root表示root的權限,NOPASSWD表示不需要密碼即可執行,/bin/ls和/bin/cat表示可執行的指令。</code>
<code>## Allows members of the 'sys' group to run networking, software,</code>
<code>## service management apps and more.</code>
<code># %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS</code>
<code>## Allows people in group wheel to run all commands</code>
<code>%wheel ALL=(ALL) ALL</code>
<code>@可以将相同權限的使用者打包成組統一做政策。</code>
<code>## Same thing without a password</code>
<code># %wheel ALL=(ALL) NOPASSWD: ALL</code>
<code>[user2@server02 root]$ </code><code>sudo</code> <code>ls</code> <code>/root/</code>
<code>We trust you have received the usual lecture from the </code><code>local</code> <code>System</code>
<code>Administrator. It usually boils down to these three things:</code>
<code> </code><code>#1) Respect the privacy of others.</code>
<code> </code><code>#2) Think before you type.</code>
<code> </code><code>#3) With great power comes great responsibility.</code>
<code>[</code><code>sudo</code><code>] password </code><code>for</code> <code>user2: </code>
<code>user2 不在 sudoers 檔案中。此事将被報告。</code>
<code>[user1@server02 root]$ </code><code>sudo</code> <code>-l @檢視本賬戶支援的</code><code>sudo</code><code>指令</code>
<code>比對此主機上 user1 的預設條目:</code>
<code> </code><code>!visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR</code>
<code> </code><code>LS_COLORS</code><code>", env_keep+="</code><code>MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",</code>
<code> </code><code>env_keep+=</code><code>"LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"</code><code>, env_keep+="LC_MONETARY</code>
<code> </code><code>LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE</code><code>", env_keep+="</code><code>LC_TIME LC_ALL LANGUAGE LINGUAS</code>
<code> </code><code>_XKB_CHARSET XAUTHORITY", secure_path=</code><code>/sbin</code><code>\:</code><code>/bin</code><code>\:</code><code>/usr/sbin</code><code>\:</code><code>/usr/bin</code>
<code>使用者 user1 可以在該主機上運作以下指令:</code>
<code> </code><code>(root) NOPASSWD: </code><code>/bin/ls</code><code>, (root) </code><code>/bin/cat</code>
<code>[user1@server02 root]$ </code><code>sudo</code> <code>ls</code> <code>/root/</code>
<code>anaconda-ks.cfg test1 test12</code>
<code>[user1@server02 root]$</code>
sudo 的适用條件:
由于su對切換到超級權限使用者root後,權限的無限制性,是以su并不能擔任多個管理者所管理的系統。如果用su來切換到超級使用者來管理系統,也不能明确哪些工作是由哪個管理者進行的操作。特别是對于伺服器的管理有多人參與管理時,最好是針對每個管理者的技術特長和管理範圍,并且有針對性的下放給權限,并且約定其使用哪些工具來完成與其相關的工作,這時我們就有必要用到sudo。 通過sudo,我們能把某些超級權限有針對性的下放,并且不需要普通使用者知道root密碼,是以sudo相對于權限無限制性的su來說,還是比較安全的,是以sudo也能被稱為受限制的su。另外sudo是需要授權許可的,是以也被稱為授權許可的su。 sudo執行指令的流程是目前使用者切換到root(或其它指定切換到的使用者),然後以root(或其它指定的切換到的使用者)身份執行指令,執行完成後,直接退回到目前使用者;而這些的前提是要通過sudo的配置檔案/etc/sudoers來進行授權。 %user1 ALL=/usr/sbin/*,/sbin/* 如果使用者組出現在/etc/sudoers 中,前面要加%号,比如%user1,中間不能有空格: 如果我們在/etc/sudoers 中加上如上一行,表示user1使用者組下的所有成員,在所有可能的出現的主機名下,都能切換到root使用者下運作/usr/sbin和/sbin目錄下的所有指令; 取消程式某類程式的執行,要在指令動作前面加上!号;在本例中也出現了通配符的*的用法。 user1 ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注:把這行規則加入到/etc/sudoers中;但您得有user1這個使用者組,并且user1也是這個組中的才行;本規則表示user1使用者在所有可能存在的主機名的主機上運作/usr/sbin和/sbin下所有的程式,但fdisk 程式除外。
3、su與sudo的差別
sudo:暫時切換到超級使用者模式以執行超級使用者權限,提示輸入密碼時該密碼為目前使用者的密碼,而不是超級賬戶的密碼。不過有時間限制,Ubuntu預設為一次時長15分鐘。 su:切換到某某使用者模式,提示輸入密碼時該密碼為切換後賬戶的密碼,用法為“su 賬戶名稱”。如果後面不加賬戶時系統預設為root賬戶,密碼也為超級賬戶的密碼。沒有時間限制。 sudo -i:為了頻繁的執行某些隻有超級使用者才能執行的權限,而不用每次輸入密碼,可以使用該指令。提示輸入密碼時該密碼為目前賬戶的密碼。沒有時間限制。執行該指令後提示符變為“#”而不是“$”。想退回普通賬戶時可以執行“exit”或“logout” 。 其實,還有幾個類似的用法: sudo /bin/bash:這個指令也會切換到root的bash下,但不能完全擁有root的所有環境變量,比如PATH,可以擁有root使用者的權限。這個指令和 sudo -s是等同的; sudo -s:如上; sudo su:這個指令,也是登入到了root,但是并沒有切換root的環境變量,比如PATH; sudo su -:這個指令,純粹的切換到root環境下,可以這樣了解,先是切換到了root身份,然後又以root身份執行了su - ,這個時候跟使用root登入沒有什麼差別。這個結果貌似跟sudo -i 的效果是一樣的,但是也有不同,sudo 隻是臨時擁有了root的權限,而su則是使用root賬号登入了linux系統。 是以,我們再來總結一下: sudo su - 約等于sudo -i sudo -s 完全等于sudo /bin/bash,約等于sudo su sudo 終究被一個"臨時權限的帽子"扣住,不能等價于純粹的登入到系統裡。
@引用内容來源于網絡,作為附加參考資料放入本篇。
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1936876,如需轉載請自行聯系原作者