阿旺的 Linux 開竅手冊

 基礎篇    進階篇    補腦篇    指令索引  


HY-STAR's  Ads IWS's Ads


版權所有, 引用請註明出處

 進階篇

Advanced Chapter 1 : 帳號和群組管理

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





















帳號和群組管理

A1.0 帳號管理

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

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

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

User Name: Password: Last: May: Must: Warn: Expire: Disable: Reserved:
1 2 3 4 5 6 7 8 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 2016-09-01

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

其他例子如下:
# useradd -m -s /bin/csh joe ←指定新增的帳號〝joe〞登入的 Shell 為〝C sehll〞
# useradd -e 2016-10-30 frank ←指定帳號失效時間為 〝2016 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
-a 配合 -G 追加附加群組
-c 修改註解,同自行修改〝/etc/passwd〞中的第 5 欄
-d PATH 修改家目錄(PATH 為 絕對路徑),同自行修改〝/etc/passwd〞中的第 6 欄
-e 修改密碼失效目期,同自行修改〝/etc/shadow〞中的第 8 欄
-f 修改密碼過期容許時間,同自行修改〝/etc/shadow〞中的第 7 欄
(如值為〝-1〞表示〝/etc/shadow〞中的第 7 欄空白)
-g GROUP 修改主群組為 GROUP
-G GROUP 新加附加群組 GROUP
-l (小寫的 L)修改帳號名稱,同自行修改〝/etc/shadow〞和〝/etc/passwd〞中的第 1 欄
-L 鎖住帳號 (〝/etc/shadow〞中密碼欄前加〝!〞或〝!!〞)
-s 修改登入時預設的 shell
-u 修改帳號的 UID
-U 解除鎖住的帳號
--help 指令自帶說明


例:(以 root 登入)
# usermod -l micle micheal ←將帳號〝micheal〞改為〝micle〞
# usermod -e 2016-10-30 micle ←修改帳號失效時間為〝2016 10月 30 日〞
# usermod alice -G sales ←為帳號〝alice〞加附加群組〝sales〞(附加群組要先用指令 groupadd 加過其名稱)
# usermod alice -a -G sub_grp ←為帳號〝alice〞再追加一加附加群組〝sub_grp〞
最後一個例子用選項〝-a G〞可加超過一個以上的附加群組。

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

^ back on top ^




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

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

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

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

newgrp 切換群組
groups 列出的群組成員都可用 newgrp 來切換, newgrp 指令會以一個子進程 shell 執行切換的群組,用 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 2016-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 ^




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

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

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

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



^ back on top ^




A1.3 sudo 越俎代庖

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

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

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

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



sudo 使用範例
sudo 指令用法比起其設定檔〝/etc/sudoers〞相對簡單多了,用法如下:
語法:sudo [-otpiton][--option] [USER_NAME][COMMAND]
指令名稱/功能/命令使用者 選項 功能
sudo/
(superuser do)/
Any
-b 在背景執行指令
-E 保留目前使用者的環境變數
-H 將 HOME 環境變數設為新身份的 HOME 環境變數
-k 再執行 sudo 時需要輸入自己的密碼
-l (小寫的 L)列出被分權的指令
-p [%u][%h][%H] 
改變詢問密碼的提示符號,可接的選項有:
〝%u〞:以使用者為提示符號
〝%h〞:以主機名稱為提示符號
〝%H〞:以主機名稱 + domain 名稱為提示符號
-u <帳號> 以指定的帳號執行指令(無此選項時預設是 root )
-v 再延長密碼有效期限 5 分鐘
-V 顯示版本訊息
--help 指令自帶說明


例:
$ sudo -l ←如忘了有那些指令可透過 sudo 執行,用選項〝-l〞就對了
User aaa may run the following commands on this hust:
     (root) /sbin/shutdown /sbin/halt
$ sudo -u lee cp fileA fileB ←雖〝sudo〞大部分是執行〝root〞授權的指令,如要指定其他授權者可用選項〝-u〞。此例〝fileB〞的檔案擁有者會變〝lee〞所有,可用於如要把某檔複製給別人修改時

其他比較不常用的用法如下:

例:
$ sudo -k ←下次再執行 sudo 時一定要輸入密碼
$ sudo -p %u /sbin/shutdown -k now ←以使用者名稱為密碼提示符號
$ sudo -H -u smith ←HOME 環境變數設為新身份〝smith〞的 HOME 環境變數
$ sudo cd /root ←利用 sduo 執行〝cd〞指令看看
sudo: cd: command not found ←sudo 是不支援 Shell 內建指令的(〝cd〞指令為 Shell 內建)

最後例子說明了 sudo 是不支援 shell 內建的指令的(可用 type 查詢指令是否為 shell 內建的),如 user 想透過 sudo cd 偷偷進入 /root 等軍事重地是行不通的。

另外〝/etc/sudoers〞如設定如下:
kevin         SERVERS=(root)        ALL

例中對帳號〝kevin〞的指令的授權用〝ALL〞是非常危險的,因只要此 user 下 sudo susudo /bin/bash 立刻就黃袍加身篡位成 Superuser。


^ back on top ^







A1.4 其他帳號相關指令
id 顯示帳號 ID
有時可能會忘記自己的 UID (User ID)或擁有那些的群組,id 指令會提供相關的資訊,id 除了可查自己的 ID,也可查其他帳號的 ID 。
 
語法:id [-otpiton][--option] [USER_NAME]
指令名稱/功能/命令使用者 選項 功能
id/(print user identity)顯示帳號 ID /
Any
-a 顯示帳號所有資訊(此為預設值)
-Z 顯示帳號和安全有關的資訊
-g 顯示有效群組 ID
-G 顯示所有的群組成員 ID
-n
顯示帳號或群組名稱(需配合〝-g〞、〝-G〞或〝-u〞使用)
-r 和〝-n〞相反,顯示帳號的 UID/GID 號碼(需配合〝-g〞、〝-G〞或〝-u〞使用)
-u 顯示帳號有效的 UID 號碼
--help 指令自帶說明


例:
$ id ←顯示帳號所有資訊
uid=500(aaa) gid=500(aaa) grpups=500(aaa),502(sub_grp) context=unconfined_u:syst
em_r:unconfined_t:s0
$ id -G ←查詢使用者有那些群組成員 ID
501 502
$ id -Gn ←同上,但顯示名稱
aaa sub_grp
$ id austin ←也可顯示其他帳號資訊

who / w 顯示登入者資訊
有時可能想了解目前有多少人登入系統;如果是系統管理員,要下關機指令前最好確定已沒有人在線上,免的有人工作到一半被關機。顯示目前有多少人登入的指令是 who 和其姊妹指令 w

who 用法如下:
語法:id [-otpiton][--option]
指令名稱/功能/命令使用者 選項 功能
who/( who is logged on)顯示登入資訊 /
Any
-a all
-b 最後開機時間
-d 顯示死進程
-H 顯示各欄位元的標題資訊列
-r
顯示 runlevel
-q 顯示登入用戶和人數
-w 或 -T 顯示使用者的資訊狀態列
i am 顯示自己的登入資訊

例:
$ who -q ←顯示登入用戶和人數
root alice frank austin
#user=4
$ who -r ←顯示 runlevel
          run-level 5 2016-06-13 05:20  
$ who -b ←顯示最後開機時間
system boot 2016-06-11 05:20
$ who i am ←顯示自己的登入資訊
alice pts/0 2016-06-13 05:21 (:0)

w 能能顯示的資訊包含登入者在執行什麼指令 。
例:
$ w
 17:22:40 up  1:16,  5 users,  load average: 0.06, 0.12, 0.08
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                16:07    3:59   0.06s  0.00s vi
john     tty2     -                16:37   38.00s  0.07s  0.01s man consolehelp
peter    tty4     -                16:37   38.00s  0.07s  0.01s -bash

lastlog 帳號登錄查詢
lastlog 可查詢某個帳號最後登入的時間,用法如下:

語法:id [-otpiton][--option] [USER_NAME]
指令名稱/功能/命令使用者 選項 功能
lastlog/(last login)帳號登錄查詢 /
Any
-b DAYS 顯示從目前算起早於 DYAS 之前的登人者
-t DAYS 顯示從目前算起 DYAS 天內的登人者
--u USER 只顯示指定的帳號
--help 指令自帶說明


$ lastlog -b 30 ←顯示 30 天前有誰登入
$ lastlog -t 7 ←顯示一星期內有誰登入
$ lastlog -u leona ←只顯示帳號〝leona〞上次的登入時間


^ back on top ^













[註1.0]:輸入 date +%s 可得知目前的時間距〝UNIX 時間元年〞過了幾秒或輸入 date -d 'YYYY/MM/DD' +%s (YYYY 為西元時間如 〝2012〞)會顯示日期距〝1970 1月 1 日 00:00〞過過了幾秒 。

[註 1.0A]:finger 顯示在家目錄這些隱藏檔應用如下:
finger 也可用來查看離線留言,算是古早可離線留言 MSN ;例如在自己家目錄下用文字編輯器寫入訊息在 〝.project〞和〝.plan〞這兩個隱藏檔,別入 finger 你的帳號時就會顯示此二個檔案的訊息。因別人要可進入你的家目錄才有辦法看到此兩個檔案的內容(Superuser 除外),故家目錄的權限需設為〝rwx --x --x〞(711) ,且這兩個檔案 other 要設可讀的(例如〝rw- rw- r--〞)。

如家目錄內有〝.forward〞檔, finger 其帳號會顯示要轉信給誰 ,上例中帳號〝john〞的〝.forward〞檔內容範例如下:
$ cat ~john/.forward
aaa@localhost ←要轉寄的 email
john@localhost ←轉寄一份給自己(如自己要保留,因系統不會保留轉寄的 email)

如果家目錄下有設轉信檔〝.forward〞但轉信卻不成功,請檢查此檔的 other 和 group 不可有〝w〞權限(用〝chmod go-w .forward〞來設定)否則系統會因安全問題而拒絕轉信。

此外如有許多的 email 帳號,如不想收信時要一一檢查每個 email 帳號,可用〝.forward〞來設定轉寄至某一 email 帳號來統一收信,效率高很多。

另一個隱藏檔〝.pgpkey〞為〝PGP key〞。

[註1.1]:實際應用如 Linux 的系統設為 UTC + 8 (以台北時間為例)輸入 date -d '1970/01/01 08:00:00' +%s 輸出才是 0,因〝UNIX 時間元年〞是以 UTC(世界標準時間)的〝1970 1月 1 日 00:00〞為準,實際應用要考慮本地時間和 UTC 的〝時差〞。

[註1.3]:Fedora 8 如沒有產生記錄檔〝/var/log/sudo.log〞,請在〝/etc/sudoers〞追加如下設定:
# Defaults specification
Defaults syslog=auth
Defaults log_year, logfile=/var/log/sudo.log

[註1.3A]:預設為間隔 5 分鐘內操作 sudo 就不用再輸入密碼。