鳥哥的Linux私房菜讀書筆記--使用者身份切換
1、su
[[email protected] ~]# su [-lm] [-c 指令] [username]
選項與引數:
- :單純使用 - 如『 su - 』代表使用 login-shell 的變數檔案讀取方式來登入系統;
若使用者名稱沒有加上去,則代表切換為 root 的身份。
-l :與 - 類似,但後面需要加欲切換的使用者賬號!也是 login-shell 的方式。
-m :-m 與 -p 是一樣的,表示『使用目前的環境設定,而不讀取新使用者的配置檔案』
-c :僅進行一次指令,所以 -c 後面可以加上指令喔!
單純使用su方式切換為人root使用者,讀取的變數設定方式為non-login shell的方式,這種方式的很多原本變數不會改變
範例三:dmtsai 想要執行『 head -n 3 /etc/shadow 』一次,且已知 root 密碼
[[email protected] ~]$ head -n 3 /etc/shadow
head: cannot open `/etc/shadow' for reading: Permission denied
[[email protected] ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==這裡輸入 root 的密碼喔!
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhOYO62vDnqfLw85...:16559:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
[
總結:
· 若要完整的切換到新使用者的環境,必須要使用『 su - username 』或『 su -l username 』, 才會連同
PATH/USER/MAIL 等變數都轉成新使用者的環境;
· 如果僅想要執行一次 root 的指令,可以利用『 su - -c "指令串" 』的方式來處理;
· 使用 root 切換成為任何使用者時,並不需要輸入新使用者的密碼;
2、sudo
相對於su切換使用者,sudo執行則僅需要自己的密碼即可,甚至不需要設定密碼就能進行切換。並非所有使用者都可以執行sudo指令,僅有規範到/etc/sudoers的使用者才可以執行sudo指令。一般使用者需要通過管理員的稽核才能開放sudo的使用權。
<1>sudo的用法
一般系統預設只有root可以執行sudo。
[[email protected] ~]# sudo [-b] [-u 新使用者賬號]
選項與引數:
b :將後續的指令放到背景中讓系統自行執行,而不與目前的 shell 產生影響
-u :後面可以接欲切換的使用者,若無此項則代表切換身份為 root 。
範例一:你想要以 sshd 的身份在 /tmp 底下建立一個名為 mysshd 的檔案
[[email protected] ~]# sudo -u sshd touch /tmp/mysshd
[[email protected] ~]# ll /tmp/mysshd
-rw-r--r--. 1 sshd sshd 0 Jul 21 23:37 /tmp/mysshd
# 特別留意,這個檔案的許可權是由 sshd 所建立的
sudo的執行流程:
(1)當用戶執行 sudo 時,系統於 /etc/sudoers 檔案中搜尋該使用者是否有執行 sudo 的許可權;
(2)若使用者具有可執行 sudo 的許可權後,便讓使用者『輸入使用者自己的密碼』來確認;
(3)若密碼輸入成功,便開始進行 sudo 後續接的指令(但 root 執行 sudo 時,不需要輸入密碼);
(4)若欲切換的身份與執行者身份相同,那也不需要輸入密碼。
<2>visudo與/etc/sudoers
由於/etc/sudoers有一定的規範,所以我們需要透過visudo去修改該檔案
(1)單一使用者可進行root所有指令與sudoers檔案語法
使用visudo指令後開啟檔案,顯示內容如下
以上四個元件的意義:
[1] 『使用者賬號』:系統的哪個賬號可以使用 sudo 這個指令的意思;
[2] 『登入者的來源主機名』:當這個賬號由哪部主機聯機到本 Linux 主機,意思是這個賬號可能是由哪一部網路主機聯機過 來的, 這個設定值可以指定客戶端計算機(信任的來源的意思)。預設值 root 可來自任何一部網路主機
[3] 『(可切換的身份)』:這個賬號可以切換成什麼身份來下達後續的指令,預設 root 可以切換成任何人;
[4] 『可下達的指令』:可用該身份下達什麼指令?這個指令請務必使用絕對路徑撰寫。 預設 root 可以切換任何身份且進行 任何指令之意。
(2)利用wheel群組以及免密功能處理visudo
[[email protected] ~]# visudo <==同樣的,請使用 root 先設定
%wheel ALL=(ALL) ALL <==大約在 106 行左右,請將這行的 # 拿掉!
# 在最左邊加上 % ,代表後面接的是一個『群組』之意!改完請儲存後離開
[[email protected] ~]# usermod -a -G wheel pro1 <==將 pro1 加入 wheel 的支援
上面的設定值會造成『任何加入 wheel 這個群組的使用者,就能夠使用 sudo 切換任何身份來操作任何指令』的意思。 你當然可以將 wheel 換成你自己想要的群組名。接下來,請分別切換身份成為 pro1 及 pro2 試看看 sudo 的運作。
[[email protected] ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro1
[sudo] password for pro1: <==輸入 pro1 的密碼喔!
pro3:$6$DMilzaKr$OeHeTDQPHzDOz/u5Cyhq1Q1dy...:16636:0:99999:7:::
[[email protected] ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro2
[sudo] password for pro2: <==輸入 pro2 的密碼喔!
pro2 is not in the sudoers file. This incident will be reported.
# 仔細看錯誤訊息他是說這個 pro2 不在 /etc/sudoers 的設定中!
這樣理解群組了吧?如果你想要讓 pro3 也支援這個 sudo 的話,不需要重新使用 visudo ,只要利用 usermod 去修改 pro3 的群組支援,讓 pro3 使用者加入 wheel 群組當中,那他就能夠進行 sudo 囉! 好了!那麼現在你知道為啥在安裝時建立的使用者,就是那個 dmstai 預設可以使用 sudo 了嗎?請使用『 id dmtsai 』看看, 這個使用者是否有加入 wheel 群組呢?嘿嘿!瞭解乎?
Tips 從 CentOS 7 開始,在 sudoers 檔案中,預設已經開放 %wheel 那一行囉!以前的 CentOS 舊版本都是沒有啟用的呢!簡單吧!不過,既然我們都信任這些 sudo 的使用者了,能否提供『不需要密碼即可使用 sudo 』呢?就透過如下的方式:
[[email protected] ~]# visudo <==同樣的,請使用 root 先設定
%wheel ALL=(ALL) NOPASSWD: ALL <==大約在 109 行左右,請將 # 拿掉!
# 在最左邊加上 % ,代表後面接的是一個『群組』之意!改完請儲存後離開
重點是那個 NOPASSWD 啦!該關鍵詞是免除密碼輸入的意思喔!
(3)有限制的指令操作:
上面兩點都會讓使用者能夠利用 root 的身份進行任何事情!這樣總是不太好~如果我想要讓使用者僅能夠進行部分系統任務,比方說,系統上面的 myuser1 僅能夠幫 root 修改其他使用者的密碼時,亦即『當使用者僅能使用 passwd 這個指令幫忙 root 修改其他使用者的密碼』時,你該如何撰寫呢?可以這樣做:
[[email protected] ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) /usr/bin/passwd <==最後指令務必用絕對路徑
上面的設定值指的是『myuser1 可以切換成為 root 使用 passwd 這個指令』的意思。其中要注意的是: 指令欄位必須要填寫絕對路徑才行!否則 visudo 會出現語法錯誤的狀況發生! 此外,上面的設定是有問題的!我們使用底下的指令操作來讓您瞭解:
[[email protected] ~]$ sudo passwd myuser3 <==注意,身份是 myuser1
[sudo] password for myuser1: <==輸入 myuser1 的密碼
Changing password for user myuser3. <==底下改的是 myuser3 的密碼喔!這樣是正確的
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[[email protected] ~]$ sudo passwd
Changing password for user root. <==見鬼!怎麼會去改 root 的密碼?
恐怖啊!我們竟然讓 root 的密碼被 myuser1 給改變了!下次 root 回來竟無法登入系統...欲哭無淚~怎辦? 所以我們必須要限制使用者的指令引數!修改的方法為將上述的那行改一改先:
[[email protected] ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
在設定值中加上驚歎號『 ! 』代表『不可執行』的意思。因此上面這一行會變成:可以執行『 passwd 任意字元』,但是『 passwd 』與『 passwd root 』這兩個指令例外! 如此一來 myuser1 就無法改變 root 的密碼了!這樣這位使用者可以具有 root 的能力幫助你修改其他使用者的密碼, 而且也不能隨意改變 root 的密碼!很有用處的!
(4)透過別名建置 visudo:
如上述第三點,如果我有 15 個使用者需要加入剛剛的管理員行列,那麼我是否要將上述那長長的設定寫入 15 行啊? 而且如果想要修改命令或者是新增命令時,那我每行都需要重新設定,很麻煩ㄟ!有沒有更簡單的方式? 是有的!透過別名即可!我們 visudo 的別名可以是『指令別名、帳戶別名、主機別名』等。不過這裡我們僅介紹帳戶別名, 其他的設定值有興趣的話,可以自行玩玩!假設我的 pro1, pro2, pro3 與 myuser1, myuser2 要加入上述的密碼管理員的 sudo 列表中, 那我可以創立一個帳戶別名稱為 ADMPW 的名稱,然後將這個名稱處理一下即可。處理的方式如下:
[[email protected] ~]# visudo <==注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
我透過 User_Alias 建立出一個新賬號,這個賬號名稱一定要使用大寫字元來處理,包括Cmnd_Alias(命令別名)、Host_Alias(來源主機名別名) 都需要使用大寫字元的!這個 ADMPW 代表後面接的那些實際賬號。 而該賬號能夠進行的指令就如同 ADMPWCOM 後面所指定的那樣!上表最後一行則寫入這兩個別名 (賬號與指令別名), 未來要修改時,我只要修改 User_Alias 以及 Cmnd_Alias 這兩行即可!設定方面會比較簡單有彈性喔!
(5)sudo 的時間間隔問題:
或許您已經發現了,那就是,如果我使用同一個賬號在短時間內重複操作 sudo 來運作指令的話,在第二次執行 sudo 時,並不需要輸入自己的密碼!sudo 還是會正確的運作喔!為什麼呢? 第一次執行 sudo 需要輸入密碼,是擔心由於使用者暫時離開座位,但有人跑來你的座位使用你的賬號作業系統之故。 所以需要你輸入一次密碼重新確認一次身份。兩次執行 sudo 的間隔在五分鐘內,那麼再次執行 sudo 時就不需要再次輸入密碼了, 這是因為系統相信你在五分鐘內不會離開你的作業,所以執行 sudo 的是同一個人!呼呼!真是很人性化的設計啊~ ^_^。不過如果兩次 sudo 操作的間隔超過 5 分鐘,那就得要重新輸入一次你的密碼
了 (注 4)
(6) sudo 搭配 su 的使用方式:
很多時候我們需要大量執行很多 root 的工作,所以一直使用 sudo 覺得很煩ㄟ!那有沒有辦法使用 sudo 搭配 su , 一口氣將身份轉為 root ,而且還用使用者自己的密碼來變成 root 呢?是有的!而且方法簡單的會讓你想笑! 我們建立一個 ADMINS 帳戶別名,然後這樣做:
[[email protected] ~]# visudo
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -
接下來,上述的 pro1, pro2, pro3, myuser1 這四個人,只要輸入『 sudo su - 』並且輸入『自己的密碼』後, 立刻變成 root 的身份!不但 root 密碼不會外流,使用者的管理也變的非常方便! 這也是實務上面多人共管一部主機時常常使用的技巧呢!這樣管理確實方便,不過還是要強調一下大前提, 那就是『這些你加入的使用者,全部都是你能夠信任的使用者』!