阿旺的 Linux 開竅手冊







基礎篇
進階篇
補腦篇
版權所有,引用請註明出處

 進階篇

Advanced Chapter 1 : 帳號和群組管理

1.0 帳號管理
       了解帳號相關設定檔
           /etc/passwd
           /etc/shadow
       passwd 變更密碼
       useradd 新增帳號
       useradel 刪除帳號
       vipw 修改 /etc/passwd
       usermod 修改帳號
       個人帳號修改
           chfn 修改帳號註解
           chsh 修改登入 Shell
           finger 查詢帳號
1.1 群組管理
           /etc/group
           /etc/gshadow
       groupadd 新增群組
       vigr 修改 /etc/group
       groups 列出群組
       newgrp 切換群組
       gpasswd 設群組密碼和成員
       groupmod 修改群組
       groupdel 刪除群組
1.2 群組協同工作
       chgrp 變更群組擁有者
       chown 變更檔案擁有者
1.3 sudo 越俎代庖
       visudo 修改 /etc/sudoers
       /etc/sudoers 設定檔
           Alias 別名設定
           TAG 標籤設定
       sudo 使用範例
1.4 consolehelper 大開方便之門
1.5 其他帳號相關指令
       id 顯示帳號 ID
       w/who 顯示登入者資訊
       lastlog 帳號登錄查詢





















帳號和群組管理

1.0 帳號管理

雖然在基礎篇的安裝 Linux已透過圖形操作界面建立過帳號,但透文字界面來管理帳號 更能作細微的教調,如設定密碼的有效日期或帳號的家目錄位置和或預設的 shell 等動作更可順便了解其原理。

Linux 是多入多工的作業系統,可同時多個使用者和群組使用,故系統管理員管理和維護這些使用者帳號是一基本和必要的工作,更何況有許多 Linux Server 根本不安裝圖形操作界面,只能透過命令方式管理。

了解帳號相關設定檔
由於帳號管理是屬於系統管理員的工作,記得要用〝root〞帳號登入才可完成大部分的操作,由於設定帳號大多是維護和變更二個重要的帳號設定檔〝/etc/passwd〞和〝/etc/shadow〞等,故有必要先了解這二個和帳號密切相關的設定檔的定義。
觀察得知〝/etc/shadow〞一樣以符號〝:〞間隔,但共記錄 9 個密碼資訊,格式為



詳細內容如下:
passwd 變更密碼
變更密碼的指令就是 passwd(password); 如要變更自己的密碼,只要簡單的用 passwd 即可(變更自己的密碼可省略帳號),如下例。

例:(以一般帳號登入測試,變更自己的帳號密碼)
[aaa@localhost ~]$ passwd ←變更自己的密碼
Changing password for user aaa.
Changing password for aaa.
(current) UNIX password: ←輸入目前的密碼
New UNIX password:←輸入新的密碼
Retype new UNIX password:←再輸入新的密碼(怕打錯字,故會要求輸入兩次)
Passwd: all authenticatin tokens updated successfully.

passwd 具有特殊權限 SUID ,故一般使用者執行時會暫時提權至 root 而有權限改變〝/etc/shadow〞對密碼的設定(相關指令如 chfn / chsh 也具相同的特殊權限)。雖然以 Superuser 登入後自行修改〝/etc/shadow〞也可完成 passwd 指令的功能,但有 9 個欄位易出錯,用 passwd 來幫你改就好了。

指令 passwd 大部份或進階用法只對 Superuser 才有效,用法如下:

語法:passwd [-otpiton][--option] [USER_NAME]
指令名稱/功能/命令使用者 選項 功能
passwd/
(password)變更密碼/
Any
-d 刪除密碼,同把〝/etc/shadow〞中把第 5 欄刪除(留空白) 只適用於 superuser
-l(小寫 L) 鎖住帳號 (〝/etc/shadow〞中的密碼欄前加〝!〞或〝!!〞) 只適用於 superuser
-u 解除已鎖住的帳號(拿掉〝/etc/shadow〞密碼欄前加的〝!〞或〝!!〞) 只適用於 superuser
-f 如沒設密碼但用過 -l 鎖住帳號此時如要解除鎖住的帳號,要配合選項 -u 用 -fu 強迫解除鎖住的帳號 只適用於 superuser
-n 設密碼不可修改天數,同自行修改〝/etc/shadow〞中的第 4 欄 只適用於 superuser
-x 設密碼的有效天數,同自行修改〝/etc/shadow〞中的第 5 欄 只適用於 superuser
-w 設密碼快失效前發出警告的天數,同自行修改〝/etc/shadow〞中的第 6 欄 只適用於 superuser
-i 設密碼過期容許時間,同自行修改〝/etc/shadow〞中的第 7 欄 只適用於 superuser
-S 輸出密碼的簡易資訊 只適用於 superuser
--stdin 輸入重定向來建立密碼 只適用於 superuser
--help 指令自帶說明  

一般使用者用 passwd 也只能改自己密碼這一功能,如要改別人的密碼,鎖住帳號,設密碼的有效天數等進階管理只有 Superuser 才行,其用法為 passwd 帳號

如某人留職停薪, Superuser 可用 vipw 在〝/etc/shadow〞的密碼欄(第二欄)的開頭加上〝!〞或〝!!〞代表此帳號暫時鎖住(不能再登入),當復職時再把〝!〞拿掉即可。但建議用指令 passwd -l passwd -u 來修改即可免去自行編輯〝/etc/shadow〞的麻煩。

例:(進階選項,只對 Superuser 有效)
# ™useradd guest; passwd –d guest ←建立一個不用登入密碼的公用臨時帳號〝guset〞
# passwd aaa ←變更帳號〝aaa〞的密碼
# passwd -l aaa ←鎖住〝aaa〞帳號(同〝/etc/shadow〞的密碼欄(第二欄)的開頭加上〝!〞或〝!!〞)
# passwd -u aaa ←解除〝aaa〞鎖住的帳號(密碼欄開頭的〝!〞或〝!!〞拿掉)
# passwd -S bbb ←輸出帳號〝bbb〞的密碼簡易資訊
# passwd -x 100 bbb ←設定帳號〝bbb〞有效天數為 100天(同修改〝/etc/shadow〞中的第 5 欄為 100)

另外如系統管理員一次要建立一堆帳號或要更改一堆密碼可用選項〝--stdin〞(時常用於 Scrip Langauge) 用輸入重定向管線來批次大量建立/更改密碼,如下範例

例:
# echo "123abc" | passwd --stdin aaa ←此時帳號〝aaa〞密碼為〝123abc〞

useradd 新增帳號
新增帳號指令 useradd 只有 Superuser 可執行,useradd 直接接帳號名稱就可增一新帳號,如沒其他的選項會伴隨的建立和帳號同名的群組。

例:
# useradd mandino ←新增帳號〝mandino〞
# cat /etc/passwd | grep '/home/mandino' | cut -d":" -f1 ←驗證一下〝/etc/passwd〞看有沒加入〝mandino〞帳號
mandino
# passwd mandino ←不要忘記,要馬上為新增的帳號設密碼

新增了一帳號後還沒用 passwd 設密碼之前如觀察〝/etc/passwd〞會發現其密碼欄(第二欄)為〝!!〞表示其帳號是鎖住的(因空有帳號還沒密碼故暫時先鎖住),故一般第二個動作會用 passwd 為此新的帳號設密碼,也可用 passwd -uf USER_NAME 強迫解除已鎖住的帳號,但因沒設密碼,所以此帳號不用密碼就可登入,雖可請此帳號的使用者登入後自行用 passwd 設自己喜歡的密碼,但不建議如此。

指令 useradd 帳號新增後相關的資訊記錄在〝/etc/shadow〞和〝/etc/passwd〞,進階用法如下:

語法:useradd [-otpiton][--option] [USER_NAME]
指令名稱/功能//命令使用者 選項 功能
useradd/
(user added)新增帳號/
Superuser
-c 增加註解,同自行修改〝/etc/passwd〞中的第 5 欄
-d PATH 指定家目錄(PATH 為 絕對路徑),同自行修改〝/etc/passwd〞中的第 6 欄
-D 顯示或變更預設帳號的值,可接的項目有
[-b]家目錄
[-e]密碼失效目期 (格式為 YYYY-MM-DD)
[-f]密碼過期容許時間
[-g]預設群組
[-G]附加群組 (supplementary groups)
[-s]設登入時預設的 shell
-e 設密碼失效日期,同自行修改〝/etc/shadow〞中的第 8 欄
-f 設密碼過期容許時間,同自行修改〝/etc/shadow〞中的第 7 欄
(如值為〝-1〞則會在〝/etc/shadow〞中的第 7 欄保持空白)
-g 設預設群組(群組名稱要存在於 /etc/group )
-G 設附加群組(附加的群組名稱要存在於 /etc/group ),附加群組用法參考群組管理
-m 自動建立家目錄
-M 不自動建立家目錄
-r 建立系統帳號(系統帳號規則為密碼欄不會過期 & 不產生家目錄 & UID 小於 500)
-s 指定登入時預設的 shell
--help 指令自帶說明

帳號建立的規則,可用 useradd -D 來查詢和變更。

例:
# useradd -D ←查詢新增帳號的規則
GROUP=100 ←群組 id=100(不過 Fedora 等發行版預設的群組名稱就是帳號名稱,此設定是無作用)
HOME=/home ←家目錄
INACTIVE=-1 ←密碼過期容許時間,值〝-1〞表示〝/etc/shadow〞中的第 7 欄空白
EXPIRE= ←密碼失效目期
SHELL=/bin/bash ←登入時預設的 shell
SKEL=/etc/skel ←新增帳號時要複製到家目錄內的檔案(一般為環境變數設定檔,且為隱藏檔)
CREATE_MAIL_SPOOL=yes ←建立 email 多工緩衝區(會在〝/var/spool/mail〞目錄下產生一對應的檔案)

實際上 useradd -D 是顯示設定檔〝/etc/default/useradd〞的內容,可自行用編輯器來變更建立一新帳號的規則,但還是建議用 useradd -D [-option] 方式來變更,比較不會出錯。

例如暑假期間公司來了一堆工讀生,都只上班到 9月 1 日,我可如下用 useradd -D [-option] 來更改設定檔〝/etc/default/useradd〞而改變新帳號的建立規則。

例:
# useradd -D -b /home -e 2011-09-01

如上改變了設定檔〝/etc/default/useradd〞,往後用 useradd 新增帳號會發現 〝/etc/shadow〞的失效時間欄(第 8 欄)都自行幫你填好了。

其他例子如下:
# useradd -m -s /bin/csh joe ←指定新增的帳號〝joe〞登入的 Shell 為〝C sehll〞
# useradd -e 2011-10-30 frank ←指定帳號失效時間為 〝2011 10 月 30 日〞
# useradd -u 507 phoebe ←指定帳號的 UID=507 (一般不用特別指定 UID)
# useradd -g qa kiwi ←建立帳號〝kiwi〞並指定群組為〝qa〞(群組名稱要已存在〝/etc/group〞)
# useradd -g qa kiwi -G factory ←同上例,但額外指定〝factroy〞為附加群組(附加的群組名稱要已存在〝/etc/group〞)

userdel 刪除帳號
和大多數帳號管理指令一樣,可自行編輯〝/etc/shadow〞和〝/etc/passwd〞來把帳號拿掉,但用指令 userdel 較方便和簡單,用法如下:
語法:userdel [-otpiton][--option] [USER_NAME]
指令名稱/功能/命令使用者 選項 功能
userdel/
(user delete)刪除帳號/
Superuser
-r 連同此帳號的家目錄和 email spool 都一並刪除
--help 指令自帶說明

例:
# userdel -r john ←連同帳號〝john〞和其家目錄和 email spool 一並刪除

vipw 修改 /etc/passwd
修改檔案〝/etc/passwd〞即可針對帳號作個別的設定,故許多 Linux 發行版怕 user 忘了要修改那個檔案,〝好心〞的提供指令 vipw ,此指令是用 vi 來開啟檔案和編輯〝/etc/passwd〞,如果〝/etc/passwd〞異動過更會好人做到底問你要不要順便修改另一檔案〝/etc/shadow〞;vipw 只有 Superuser 才可執行。

因自行編輯 〝/etc/passwd〞和〝/etc/shadow〞因欄位太多容易弄錯,(且許多人對〝惡毒的介面〞的 vi 很反感) 建議用接下來介紹的 usermod 來設定比較安全。

usermod 修改帳號
修改帳號指令 usermod 有點類似 useraddpasswd 的綜合體,可修改帳號名稱、所屬群組、密碼的有效期限等;當然只要 Superuser 才可執行,用法如下:

語法:usermod [-otpiton][--option] [USER_NAME][NEW USER_NAME OLD_USER_NAME]
指令名稱/功能/命令使用者 選項 功能
usermod/
(user modify)修改帳號/
Superuser
-c 修改註解,同自行修改〝/etc/passwd〞中的第 5 欄
-d PATH 修改家目錄(PATH 為 絕對路徑),同自行修改〝/etc/passwd〞中的第 6 欄
-e 修改密碼失效目期,同自行修改〝/etc/shadow〞中的第 8 欄
-f 修改密碼過期容許時間,同自行修改〝/etc/shadow〞中的第 7 欄
(如值為〝-1〞表示〝/etc/shadow〞中的第 7 欄空白)
-g 修改群組
-G 修改附加群組
-l (小寫的 L)修改帳號,同自行修改〝/etc/shadow〞和〝/etc/passwd〞中的第 1 欄
-L 鎖住帳號 (〝/etc/shadow〞中密碼欄前加〝!〞或〝!!〞)
-s 修改登入時預設的 shell
-u 修改帳號的 UID
-U 解除鎖住的帳號
--help 指令自帶說明

例:
# usermod -l micle micheal ←將帳號〝micheal〞改為〝micle〞
# usermod -e 2011-10-30 micle ←修改帳號失效時間為〝2011 10月 30 日〞


個人帳號修改
上述介紹過的帳號管理指令,除了 passwd 外都只有 superuser 才可執行,其實一般的使用者也可有限度的更改一些設定,例如可變更自己習慣的 shell,變更全名或查詢帳號等,下列為一般使用者也可執行的帳號管理指令。



^ back on top ^




1.1 群組管理

useradd 建立帳號同時也會建立和帳號同名的預設群組(default group),但群組名稱不一定要和帳號同名且可加入一個以上的群組方便群組協同工作共享資源。

和帳號的兩個重要設定檔〝/etc/passwd〞、〝/etc/shadow〞類似,群組相對應的檔案為〝/etc/group〞和〝/etc/gshadow〞,因少了和時間有關的欄位故相對簡單許多。
groupadd 新增群組
或許 user 發現上面介紹過的指令 useradd 就有選項〝-g〞或〝-G〞可建立群組/附加群組?為什還要有此指令來新增群組?有疑問就實驗看看吧!

實驗建立〝附加群組〞:(以 Superuser 登入)
# useradd ccc -G sub_grp ←新增帳號〝ccc〞並建立附加群組〝sub_grp〞
useradd: unknown group sub_grp ←?? 不明的〝sub_grp〞群組

上例為什麼不能建立帳號時同時也建立附加群組 (supplementary groups)呢? 原因是某一帳號要加入某一附加群組,其群組名稱要記錄在〝/etc/group〞(還有相對應的〝/etc/gshadow〞),否則會拒絕為其加入。把群組名稱加到〝/etc/group〞其指令為 groupadd

例:
# groupadd sub_grp ←新增群組〝sub_grp〞
# tail -4 /etc/group ←確認看有無記錄在〝/etc/group〞
haldaemon:x:68:
aaa:x:500:
bbb:x:501:
sub_grp:x:502: ←新增群組在這 :-)
# useradd ccc -G sub_grp ←現在可新增帳號〝ccc〞時順便建立附加群組〝sub_grp〞
# tail -4 /etc/group ←查看〝/etc/group〞
vboxsf:x:491:
aaa:x:500:
bbb:x:501:
sub_grp:x:502:ccc ←群組〝sub_grp〞的成員有帳號〝ccc〞
ccc:x:503:

為新增的帳號加了附加群組後就可用 newgrp 來切換預設群組和附加的群組。

vigr 修改 /etcgroup
指令groupadd 主要在檔案〝/etc/group〞和〝/etc/gshadow〞加上群組名稱,也可用指令 vigr 利用 vi 來開啓和修改檔案〝/etc/group〞(如此檔有編輯過會詢問是否順便編制〝/etc/gshadow〞)可也達到指令 groupaddgroupdel 增減群組的功能。

groups 列出群組
剛才例子新增帳號〝ccc〞並建立附加群組〝sub_grp〞,接下來用新增的帳號登入來說明如何切換〝主群組〞(primary group)和〝附加群組〞(supplementary groups)。
(記得請 Superuser 用 passwd 為新增的帳號〝ccc〞設密碼,不然無法登入測試)。

例:(續上例,以剛新增的帳號〝ccc〞登入測試)
[ccc@localhost ~]$ groups ←列出目前帳號有那些群組
ccc sub_grp ←目前列出有二個群組〝ccc〞和〝sub_grp〞,這些群組為此帳號的〝群組成員〞

上例中用 groups 列出的群組第一個出現的為有效的群組( effective group )。

newgrp 切換群組
groups 列出的群組成員都可用 newgrp 來切換, newgrp 指令會以一個子程序 shel 執行切換的群組。輸入 exit 又回到原群組。

例:(續上例,以剛新增的帳號〝ccc〞登入測試)
[ccc@localhost ~]$ newgrp sub_grp ←切換到群組〝sub_grp〞
[ccc@localhost ~]$ groups ←看一下有效群組是否已變〝sub_grp〞
sub_grp ccc ←群組〝sub_grp〞在第一欄了
[ccc@localhost ~]$ echo 'hello' > test_grp.txt ←建立一檔案看一下檔案的群組屬誰
[ccc@localhost ~]$ ls -l test_grp.txt
-rw-r--r-- 1 ccc sub_grp 15 2011-09-06 14:26 test_grp.txt ←檔案群組已屬〝sub_grp〞
[ccc@localhost ~]$ exit ←退出目前的 Shell,群組會回到原主群組〝ccc〞
[ccc@localhost ~]$ groups ←看一下目前群組是否回到原主群組
ccc sub_grp ←群組〝ccc〞在第一欄了

newgrp 切換的有效群組是暫時的,exit 或重開機就恢復成預設群組(default group)。

gpasswd 設群組密碼和成員
如果系統管理員用 useradd 新增帳號時沒用〝-G〞選項建立附加群組,事後可用 gpasswd 來追加,此指令有二個主要功能,一是建立群組密碼,二是增減群組的成員,gpasswd 只有 Superuser 和群組管理員才可使用,用法如下:

語法:gpasswd [-otpiton] [USER_NAME][MEMBER]
指令名稱/功能/命令使用者 選項 功能
gpasswd/
(group passwd)設群組密碼和成員和/
Superuser & Group administrator
-a 指定群組成員(加在〝/etc/group〞和〝/etc/gshadow〞的 member 欄)
-d 從群組中刪除用戶(刪除〝/etc/group〞和〝/etc/gshadow〞的 member 欄)
-A 指定群組管理員(此選項只有 Superuser 才可用,指定的群組管理員加在〝/etc/gshadow〞Admin 欄)
-r 移除群組密碼 (刪除〝/etc/group〞和〝/etc/gshadow〞的密碼欄)
-R 鎖住群組 (此時〝/etc/gshadow〞的密碼欄開頭會變〝!〞)
--help 指令自帶說明

先來說明一下群組密碼,gpasswd 如沒有選項時是設群組密碼,但其密碼只針對非群組成員的帳碼切換到該群組才需要輸入密碼。例如上例群組〝sub_grp〞其群組成員有〝ccc〞,故此帳號用 newgrp 切換到群組〝sub_grp〞並不會要求輸入密碼。但對非群組成員的帳號要切換到該群組就要輸入密碼。

我們來實測一下吧!

(以 Superuser 登入,續上例)
# gpasswd sub_grp ←為群組〝sub_grp〞設密碼
Changing the password for group sub_grp
New Password: ←輸入要給予的密碼
Re-enter new password: ←輸入二次密碼確認
# su - aaa ←切換帳號〝aaa〞(找一非〝sub_grp〞這群組成員的帳號測試)
$ newgrp sub_grp ←以帳號〝aaa〞加入群組〝sub_grp〞看可不可加入
Passwd: ←輸入該群組的密碼後就可加入群組〝sub_grp〞

另外如果該群組沒設密碼,或用 gpasswd -R 鎖住群組則非群組成員永遠無法使用該群組。

Superuser 如想偷懶,可為每一群組指定一個帳號為群主管理員,而該群主管理員即可執行 gpaasswd 來管理此一群組(群組管理員不一定要是該群組的群組成員)。

其他範例如下:

例:
# gpasswd -a aaa sub_grp ←將群組〝sub_grp〞加入帳號〝aaa〞
# gpasswd -d aaa sub_grp ←群組〝sub_grp〞刪除帳號〝aaa〞
# gpasswd -r sub_grp ←移除群組〝sub_grp〞密碼
# gpasswd -A aaa sub_grp ←將帳號〝aaa〞設成〝sub_grp〞這群組的群組管理員
# gpasswd -R sub_grp ←鎖住群組〝sub_grp〞(其他人都不能用 newgrp 加入,要解除只能重設密碼)


groupmod 修改群組
已建立的的群組,也是可微調的,但 groupmod 最重要的功能應是更改群組名稱,用法如下:

語法:groupmod [-otpiton] [NEW_GROUP][OLD_GROUP]
指令名稱/功能/命令使用者 選項 功能
groupmod/
(group modify)修改群組/
Superuser
-g 修改 GID
-o 和 -g 配合使用,可指定重複的 GID 號碼
-n 更改群組名稱
--help 指令自帶說明

例:
# groupmod -g 800 -o sub_grp ←修改群組〝sub_grp〞的 GID=800
# groupmod -n hr_grp sub_grp ←將群組〝sub_grp〞改名為〝hr_grp〞(新群組名要寫在前)

useradd 建立帳號時,如預設的群組名稱不滿意可用 groupmod -n NEW OLD 來改意預設群組名稱 ,且還會自動把之前所建的檔案的群組名稱改為新的群組名稱。

groupdel 刪除群組
刪除群組指令 groupdel 用法很簡單就 groupdel GROUP,也是只有 superuser 才可執行。

groupdel 只可刪除附加的群組,但不能刪除主群組(primary group)。


^ back on top ^




1.2 群組協同工作
群組管理的目的是共享資料,一般來說共享的資源有目錄或檔案。

以目錄來說,把某目錄設 Set Group ID Bit 不管誰把檔案丟到此目錄內,該檔案的群組會自動變和目錄的群組相同。

另一個方法為如許多帳號都設同一群組或加入某附加群組,而要分享的目錄或檔案群組的擁有者設共同群組名稱就可共享目錄或檔案(當然檔案或目錄的權限也要設正確)。

改變檔案或目錄的群組擁有者可用 chownchgrp



^ back on top ^




1.3 sudo 越俎代庖

有時系統管理員太忙分身乏術,有些工作事實上可請別人代勞,如帳號管理工作可請人資部人員來管理。雖簡單的用指令 su 可讓代勞人員變更為系統管理員來處理,但 su 最大問題是要把密碼要告訴代理人員;所以可能會造成安全上的問題。

有沒辦法讓代理人員執行某一必要任務時才拿到軍符提昇權限至最高指揮官等級的〝root〞但又不至於到〝將在外軍令有所不從〞不受控的地步?是有這東西就是 sudo (superuser do)指令。

系統管理員可利用 sudo 釋出部分的權限給代理人員來分擔工作,這些代理人員又叫〝sudoer〞,而 sudosu 相比特點有 : 總之 sudo 特點為可不用繳械把系統管理員密碼給代理人,而代理人員又可〝越俎代庖〞執行部分系統管理員才可執行的指令,但又可防止代理人員〝功高震主〞如自行篡改〝root〞帳號密碼或不小心把系統給弄的一團亂。

因系統無法預測系統管理員要分權給誰和釋出多少權限,故預設的情形一般的帳號是無法使用 sudo 的(〝root〞除外),要使用 sudo 系統管理員要編輯 sudoer 列表〝/etc/sudoers〞後才能使用。