1. 程式人生 > 實用技巧 >CentOS 基礎命令 II

CentOS 基礎命令 II


訪問控制

檔案系統訪問控制

“In Linux everything is a file.” 也就是說 Linux 中所有的東西都以檔案實現,比如文字檔案、目錄、磁碟、程序等。

一般來說,每個人擁有自己建立的資源,同組的人擁有共同分享的資源,當然還有個其他人。這時就引入了檔案所有權的概念:檔案的屬主(user)、所屬組(group)和其他人(other)。

對檔案的操作一般會是,開啟、讀取、編寫、執行、修改、刪除、複製或者無法操作等。這又有了檔案的訪問許可權,讀(read)、寫(write)、執行(execute)和無許可權(no permission)。那麼檔案的屬主、所屬組和其他人就分別具有了對檔案的各自訪問許可權。

注: 超級使用者 root 擁有和管理系統所有的資源。

所有權表

所有權 屬主 所屬組 其他人
ownership user group other
符號表示法 u g o

訪問許可權表

訪問許可權 access permission 符號表示法 二進位制位表示法
read r 4
write w 2
執行 execute x 1
無許可權 no permission - 0
全許可權 full permission rwxrwxxrwx 777
ls -l		# 檢視當前目錄內的檔案。

...
-rw-r--r--.  1 root root     9580 Sep  19 10:18 Hello-Lucky
...

新建一個檔案,其所有權預設屬主和所屬組分別為建立者和與建立者賬戶同名的組;檔案的訪問許可權檔案(也可以稱為,檔案的許可權模式位)可以體現屬主、所屬組和其它人對此檔案的讀、寫和執行許可權。

新建檔案的預設訪問許可權由 umask 的值決定,可以在命令列執行 umask 以輸出其值。超級使用者 root 的預設所屬組為 root,正如 Hello-Lucky 檔案資訊所示。

新建目錄的預設訪問許可權為全許可權(rwxrwxrwx 或 777 ,也就是 4+2+1=7,4+2+1=7,4+2+1=7)按位減去模式位掩碼值(umask 值)。

新建檔案的預設訪問許可權為不可執行檔案的全許可權(rw-rw-rw- 或 666)按位減去模式位掩碼值。

新建目錄與檔案的訪問許可權表

使用者賬號分類 檔案的型別 全許可權 umask 值 實際許可權
root 目錄 777 022 755
root 檔案 666 022 644
普通使用者 目錄 777 002 775
普通使用者 檔案 666 002 664

讀、寫和執行許可權對應於目錄和檔案的相關操作

目錄的訪問許可權:

讀和執行許可權共同控制著目錄內容的列出;寫和執行許可權共同控制著在目錄中建立、刪除、重新命名檔案。

注: 檔名和資料儲存空間之間的對映實際上是儲存在目錄中的。

讀-控制著是否可以列表目錄內檔案的名稱及型別。如果同時具有執行許可權,則可以開啟和讀取檔案內容及其它相關資訊。
寫-控制著是否可以在此目錄下刪除、重新命名、重建,但前提是必須同時具有執行許可權。
執行-控制著是否可以進入目錄並開啟和讀取檔案的內容及除了檔名稱和型別的其它相關資訊。

檔案的訪問許可權:

讀-可開啟並讀取檔案內容。
寫-可修改檔案內容。
執行-可允許檔案被執行(如果檔案是可執行檔案)。

注:在具有寫和執行許可權的目錄下,只讀檔案的內容可以修改(例如用 vi、vim 等強行修改)。


使用者管理

與使用者賬號資訊相關聯的檔案:

/etc/passwd				# 使用者賬號資訊。
/etc/shadow				# 使用者賬號安全資訊。
/etc/group				# 組資訊。
/etc/gshadow			# 組安全資訊。
/etc/default/useradd		# 賬號建立預設值。
/etc/login.defs			# 賬號建立配置套件。
# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
...
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
...

/etc/passwd 檔案中每行記錄一個使用者,包含 7 個由冒號分隔的欄位。欄位定義如下:

登入名
加密密碼的預留位置
UID(user ID,使用者 ID,組 ID)
預設的 GID(group ID,組 ID)數字
可選的 “GECOS” 資訊:全名、辦公室、分機號、家庭電話
主目錄
登入 shell
# cat /etc/shadow

root:$6$m1WStj.gXGRhKsr.$SZAFjyEz4R.Tfg66htL0FFUNYkrN.dgr3Pr.L/SVA3MQkQypQ21.VyXbX3cLz9bZ8.qr8x.::0:99999:7:::

/etc/shadow 檔案對應與 /etc/passwd 檔案,每行記錄一個使用者,包含 9 個由冒號分隔的欄位。

登入名
加密密碼
上一次更改密碼的日期
密碼更改的最小間隔天數
密碼更改的最大間隔天數
提前警告使用者密碼過期天數
密碼過期後多少天禁用該賬戶
賬戶過期日期
備用的保留欄位,目前還空著

使用者管理相關命令:

useradd、passwd、userdel、usermod、groupadd、groupdel、chown、chgrp


useradd

useradd [options] LOGIN

create a new user or update default new user information
建立一個新使用者或更新新使用者預設資訊。

-r			# 建立系統使用者。
-s			# 指定 shell,預設位 bash shell,通常用於指定 /sbin/nologin。
-g			# 指定所屬組。
-M			# 不建立使用者家目錄。

示例:

useradd -r system_user009		# 新增一個系統使用者。
id system_user009		# 檢視使用者 UID GID。

uid=997(system_user009) gid=995(system_user009) 組=995(system_user009)

cat /etc/passwd		# 檢視 /etc/passwd 檔案。

...
system_user009:x:997:995:system_user009:/home/system_user009:/bin/bash
...

cat /etc/shadow		# 檢視 /etc/shadow 檔案。
...

useradd -M -s /sbin/nologin nohome_nologin_user009		# 建立一個沒有家目錄、shell 為 /sbin/nologin 的使用者。
id nohome_nologin_user009		# 檢視使用者 UID GID。

uid=1002(nohome_nologin_user009) gid=1002(nohome_nologin_user009) 組=1002(nohome_nologin_user009)

cat /etc/passwd

nohome_noshell_user009:x:1002:1002::/home/nohome_nologin_user009:/sbin/nologin

cat /etc/shadow

groupadd fun_club				# 新增一個組。
useradd -g fun_club fun_member01		# 新增使用者並指定組。

userdel

userdel [options] LOGIN

delete a user account and related files
刪除一個使用者賬戶及其相關檔案。


-r		# 刪除使用者賬號的同時刪除其家目錄和郵箱。 
-f		# 強制刪除使用者,即使使用者還在登入狀態。

示例:

useradd test_user001		# 新增一個使用者。
id test_user001				# 檢視使用者 ID 以檢查使用者是否新增成功。
userdel test_user001		# 刪除此使用者,預設不刪除其家目錄和郵箱。
ls -al /home				# 檢視 /home 是否留有使用者家目錄。

useradd test_user001		
userdel -r test_user001		# 刪除此使用者及其家目錄和郵箱。
ls -al /home				# 檢視刪除結果。


passwd

passwd [option] [username]

update user's authentication tokens
更新使用者的身份驗證令牌。

-l, --lock		# 鎖定使用者密碼。通過在加密密碼段前加感嘆號使密碼無效,但賬號並未完全鎖定,仍然可以通過 ssh 公鑰方式進行身份驗證。 手冊頁建議使用 chage -E 0 user 命令來完全鎖定賬號。

-u, --unlock		# 解鎖賬號。通過移除加密密碼前的感嘆號來實現。如果加密密碼段裡只有一個感嘆號,就需要同時使用 -f 選項來解鎖。

-f, --force		# 強制特定操作,如 -u。

-S, --status		# 檢視賬戶狀態。對應與賬戶在 /etc/shadow 中欄位的資訊。第二個欄位為 LK、NP 和 PS 之一,分別代表賬號鎖定、無密碼和有密碼。

--stdin			# 從輸入讀取密碼。

--d, --delete		# 刪除賬號的密碼。

-n, --minimum DAYS	# 設定密碼更改的最小間隔天數。

-x, --maximum DAYS	# 設定密碼更改的最大間隔天數。

-w, --warning DAYS	# 設定提前警告使用者密碼過期天數。

-i, --inactive DAYS	# 設定密碼過期後多少天禁用該賬戶。

-e, --expire		# 賬戶密碼立刻過期,下次登入必須修改密碼。

示例:

userdel -r test_user001		# 刪除賬戶。
useradd test_user001		# 新增賬戶。
passwd -S test_user001		# 檢視賬戶資訊。
passwd test_user001			# 設定 test_user001 賬戶密碼。重複輸入兩次。
passwd -S test_user001		# 設定密碼後再次檢視賬戶資訊。

login				# 以 login 方式登入 test_user001,檢測密碼設定。
exit				# 退出,登入 root。

echo "password" | passwd --stdin test_user001
# --stdin 通常用於在指令碼中大批量設定初始密碼。

passwd -l test_user001		# 鎖定賬戶。
passwd -S test_user001		# 檢視賬戶資訊。

passwd -u test_user001		# 解鎖賬戶。
passwd -S test_user001		# 檢視賬戶資訊。

注:設定賬戶資訊在 /etc/shadow 檔案中 4-8 欄位的選項,請自行測試。


usermod

usermod [options] LOGIN

modify a user account
修改使用者賬號

-a, --append		# 新增指定附加組,與 -G 共同使用。
-g, --gid GROUP		# 更改使用者初始組為新組。使用者家目錄的所有檔案的所屬組也會更新,但家目錄外的檔案就只能手動修改了;另外作為一種安全措施,如果使用者 ID 與 新的所屬組 ID 不同的話,也不會修改。
-G, --group GROUP1[,GROUP2,...[,GROUPN]]]		# 用逗號分隔的組列表來指定使用者所屬多個組,如果使用者原所屬組不在此列表中,則會刪除原所屬組。可以同時使用 -a 選項使其只新增組列表。


-d, --home HOME_DIR		# 僅在使用者賬戶資訊中設定指定家目錄資訊。如果還給定 -m 選項,原家目錄中的內容會移動到新目錄。如果原家目錄不存在,則不會建立新的家目錄。

-m, --move-home			# 此選項僅和 -d 選項同時使用才有效。原家目錄中的內容會移動到新目錄。如果原家目錄不存在,則不會建立新的家目錄。usermod 會更新檔案的所有權、檔案許可權模式位、訪問控制列表及擴充套件屬性,另外還可能需要手動操作。

-l, --login NEW_LOGIN	# 更該使用者賬號,僅此而已。其它所有更新都必須手動操作。

-e, --expiredate EXPIRE_DATE		# 指定賬號過期時間,日期格式為 YYYY-MM-DD。等同 chage -E 0 user_account。

示例:

useradd sg_user001			# 建立新使用者
useradd sg_user002			# 同上
usermod -a -G sg_user001 sg_user002		# 把 sg_user001 新增附屬組 sg_user002。		
cat /etc/group				# 檢視組資訊。

...
sg_user001:x:1006:sg_user002
sg_user002:x:1007:
...

echo "1" | passwd --stdin sg_user002	# 設定密碼。
usermod -e 0 sg_user002					# 設定賬號到期。
login sg_user002				#登入以檢視賬號是否到期。

groupadd

groupadd [options] group

create a new group
建立一個新組。

-r, -system				# 建立一個系統組。
-g, --gid GID			# 建立新組並指定 GID。

示例:

groupadd -r system_group			# 建立系統組。
cat /etc/group						# 檢查所建立的組。

groupadd -g 1128 spe_id_group		# 指定 GID 為 1128 的普通組。
cat /etc/group

groupdel

groupdel [options] GROUP

delete a group
刪除一個組。

示例:

groupdel spe_id_group			# 刪除指定的組。
cat /etc/group					# 檢查組是否刪除。

chown

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

change file owner and group
更改檔案的屬主和所屬組。

--dereference				# 只更改符號連結所指向檔案的所屬權,而不是連結檔案本身。chown 命令預設行為。
-h, --no-dereference		# 只更改符號連結本身的所屬權,而不是符號連結指向的檔案。

--reference=RFILE			# 引用 RFILE 檔案所屬權來更改指定檔案的所屬權。

-R, --recursive				# 遞迴處理。
遞迴處理時如果選擇多個以下子選項,則最後一個生效:
	-H				# 如果命令列引數是一個指向目錄的符號連結,則遍歷。
	-L				# 遍歷遇到的每一個符號連結指向的目錄。
	-P				# 不遍歷符號連結指向的目錄。預設行為。

--from=CURRENT_OWNER:CURRENT_GROUP			# 只從目標檔案中選出匹配指定所屬權(CURRENT_OWNER:CURRENT_GROUP)的檔案進行更改所屬權。

chgrp

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

change group ownership
更改所屬組。

具有 chown 同樣的選項,但它只能修改所屬組。


檔案許可權管理相關命令

chmod


chmod

chmod [OPTION]... MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

change file mode bits
修改檔案模式位

--R, --recursive				# 遞迴處理。
--reference=RFILE				# 引用 RFILE 檔案的許可權更新目標檔案的許可權。

chmod 許可權修改格式表

所有權型別 修改操作 許可權
u = user + r | 4
g = group - w | 2
o = other = x | 1
a = all - | 0

注: 或者以符合此正則的格式:[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+

示例:

chmod o+w Hello-Lucky			# 對其他所有人新增可寫許可權。
chmod o=rw Hello-Lucky			# 效果同上。
chmod a+w Hello-Lucky			# 對所有人新增可寫許可權。
chmod a+2 Hello-Lucky			# 效果同上。

chmod g-w Hello-Lucky			# 對所屬組減去可寫許可權。
chmod o-w Hello-Lucky			# 對其他所有人減去可寫許可權。
	
chmod g-w,o-w Hello-Lucky		# 等同以上兩次命令的效果。

chmod 644 Hello-Lucky			# 直接設定檔案的許可權為上面顯示的許可權值。
chmod ugo=rw-r--r-- Hello-Lucky				# 效果同上。

示例:

# 檢驗目錄許可權對其內檔案的影響。

useradd testuser01				# 新增一個使用者。
passwd testuser01				# 為其設定密碼。

mkdir /test_{r,w,x,rw,wx,rx}	# 建立六個目錄。

# 在六個目錄下分別建立一個檔案。

echo 'a file in a dir with read permission' >> /test_r/testr.txt
echo 'a file in a dir with write permission' >> /test_w/testw.txt
echo 'a file in a dir with execute permission' >> /test_x/testx.txt
echo 'a file in a dir with read and write permission' >> /test_rw/testrw.txt
echo 'a file in a dir with write and execute permission' >> /test_wx/testwx.txt
echo 'a file in a dir with read and execute permission' >> /test_rx/testrx.txt

# 分別更改這六個目錄的屬性

chmod o=r test_r
chmod o=w test_w
chmod o=x test_x
chmod o=rw test_rw
chmod o=wx test_wx
chmod o=rx test_rx

login testuser01				# 登入 testuser01

ll -d /test*				# 檢視目錄屬性。
ll /test*					# 檢視目錄檔案。

請自行嘗試,看看那些檔案可以用 testuser01 修改。

檔案的特殊許可權

setuid 許可權

setuid 許可權是讓可執行程式的執行者臨時提權到檔案屬主的許可權,以訪問原先沒有許可權訪問的檔案和程序。比如命令 passwd,任何人都可用此命令訪問 root 才有權訪問的 /etc/shadow 等檔案來更改自己的密碼。

許可權賦予方式: chmod u+t [execute_file]

setgid 許可權

setgid 許可權賦予可執行檔案,則可執行程式的執行者臨時提權到檔案所屬組的許可權。 如果賦予目錄,則在此目錄中建立的檔案的所屬組為目錄的所屬組,而不是預設的所屬組。一般用於在多個使用者之間共享目錄,只要這些使用者都屬於同一個組。

許可權賦予方式: chmod g+t [execute_file | dir]

sticky bit 許可權

sticky bit 許可權一般用與建立像目錄 /tmp 同樣許可權 1777 的目錄,任何人都可以在其中建立只有自己和 root 可以完全管理的目錄和檔案。

sticky bit 許可權如果賦予檔案,則即使檔案的其他人具有所有許可權,也無法刪除此檔案,但可以修改內容。

許可權賦予方式: chmod o+t [dir | file]

注: 特殊許可權位一般很少用,共享檔案可以使用 NFS, SAMBA 服務,但你得知道這麼回事,以解決未來可能會碰到的詭異許可權問題。


Linux 檔案擴充套件屬性

Linux 定義了一組可以在檔案上設定的擴充套件屬性,以請求一些特殊的處理。但這些屬性在不同的檔案系統上並沒有完全獲得支援。

擴充套件屬性標誌解釋表

標誌 檔案系統 解釋
a XBE 只能追加。
A XBE 不更新訪問時間。
c B 壓縮。
C B 不寫時複製。
d XBE 不做備份。
D BE 強制目錄更新被同步寫入。
e XBE 使用塊擴充套件儲存檔案。
i XBE 不可修改。
j E 資料先寫入日誌再寫入檔案。
s XBE 刪除則用零填充,不可恢復。
S XBE 強制同步,不寫入緩衝。

檔案擴充套件屬性相關命令: chattr、getattr


chattr

chattr [option] +|- attributes FILE

change file attributes on a Linux file system
更改檔案擴充套件屬性。

-R			# 遞迴處理。

lsattr

lsattr [option] FILE

list file attributes on a Linux second extended file system
顯示檔案擴充套件屬性。

-R			# 遞迴處理。

同樣要注意,如果某個檔案很怪異,要用 lsattr 查一下。


檔案訪問控制列表

檔案訪問控制列表(ACL)是一套類似九位許可權模型的許可權控制。

格式 許可權符號 許可權設定的物件
user::perms r 檔案的屬主
user:username:perms w 指定的使用者
group::perms x 檔案的所屬主
group:groupname:perms - 指定的所屬主
other::perms 其他人
mask 除屬主和其他人之外的所有人

注: mask 類似 umask 值,但它是設定除屬主和其他人之外的所有人的最高許可權。

setfacl

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...

set file access control lists
設定檔案訪問控制列表。

-m			# 設定 ACL 許可權。
-x			# 取消指定使用者或組的 ACL 許可權。

-R			# 遞迴處理。

-b			# 重置指定檔案為無 ACL 許可權 。

-M			# 從指定檔案讀取 ACL 許可權,批量設定許可權。
-X			# 從指定檔案讀取 ACL 許可權,批量取消許可權。

getfacl

get file access control lists
獲取檔案的訪問控制列表。

示例:

useradd testuser01			# 建立一個使用者。

mkdir /test			# 在指定目錄下建立一個檔案。
echo 'a test file' >> /test/test01.txt

getfacl /test/test01.txt	# 檢視其 ACL 初始狀態。
# file: test/test01.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

# 為此檔案設定 ACL,一讓 testuser01 可對此檔案進行讀寫。
setfacl -m user:testuser01:rw /test/test01.txt

getfacl /test/test01.txt
# file: test/test01.txt
# owner: root
# group: root
user::rw-
user:testuser01:rw-
group::r--
mask::rw-
other::r--

su - testuser01			# 切換到使用者 testuser01。

# 新增一行文字到檔案。
echo 'redirect a line.' >> /test/test01.tx

# 設定 mask 許可權。
exit			# 返回 root。

setfacl mask::r /test/test01	# 此時 testuser01 就不能在修改此檔案了。
getfacl /test/test01
# file: test/test01.txt
# owner: root
# group: root
user::rw-
user:testuser01:rw-		#effective:r--
group::r--
mask::r--
other::r--

# 每一次修改 ACL, mask 值會發生相應變化。

useradd testuser02
setfacl -m user:testuser02:rw /test/test01.txt
getfacl /test/test01.txt
# file: test/test01.txt
# owner: root
# group: root
user::rw-
user:testuser01:rw-
user:testuser01:rw-
group::r--
mask::rw-				# 注意 mask 值。
other::r--

su

su [ - | --login ] user

run a command with substitute user and group ID
使用替換的使用者和組執行命令。

如何指定的使用者不是 root,su 預設不改變當前目錄,僅設定環境變數 HOME、SHELL、USER、LOGNAME。

如果使用 - | --login 則類似於使用指定使用者登入。建議使用 --login 選項,以避免混合環境造成的副作用。

注:root 使用者切換為普通使用者不用輸入密碼。

示例:

useradd example_user01          # 新增一個使用者。
su --login example_user01       # 以類似登入方式切換到指定使用者。

sudo

sudo 可以定義哪些使用者可以在哪些主機上執行哪些命令集或軟體集,而且可以在不具有 root 使用者密碼的前提下來執行命令,每次 sudo 都會記錄到相關日誌。其配置檔案為 /etc/sudoers,必須用 visudo 來編輯。

/etc/sudoers 配置檔案內容:

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using 
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

# 定義主機集合:  Host_Alias    主機集合名稱1 = 主機1,主機2,...

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname 
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem

# 定義使用者集合:  User_Alias    使用者集合名稱1 = 使用者1,使用者2,...

## Command Aliases
## These are groups of related commands...

# 定義命令集合:  Cmnd_Alias    命令集合名稱1 = 命令1,命令2,...
# 命令都是以完整路徑出現的,是為了避免使用者以 root 使用者執行自己的程式或指令碼。

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp 

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

# 預設環境配置。

#
# Refuse to run if unable to disable echo on the tty.
#
Defaults   !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home
Defaults    match_group_by_gid

# Prior to version 1.8.15, groups listed in sudoers that were not
# found in the system group database were passed to the group
# plugin, if any. Starting with 1.8.15, only groups of the form
# %:group are resolved via the group plugin by default.
# We enable always_query_group_plugin to restore old behavior.
# Disable this option for new behavior.
Defaults    always_query_group_plugin

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## 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

# 上行的意思為,root 可以在所有的主機執行所有的命令。
# 哪些使用者可以在哪些主機執行哪些命令或軟體。



## 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

# 上行的意思為,wheel 組的使用者可以在所有的主機執行所有的命令。

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

# NOPASSWD: 不需求密碼。非常不建議如此設定。

## Allows members of the users group to mount and unmount the 
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

# sudo 總是服從所有匹配到最後一行,也就是說,如果匹配條目有衝突,總是後面的其作用。

注:sudoers 配置很複雜,但一般只要把管理員賬號新增到 wheel 組就好了,配置都不用改就能滿足大多數要求。

示例:

useradd -r -g wheel sysacc_01       # 建立一個屬於 wheel 組系統使用者。
passwd sysacc_01                    # 設定密碼。
su --login sysacc_01                # 切換到系統使用者。
sudo cat /etc/passwd                # 檢視 root 使用者許可權檔案。

# 這時就要養成使用 sudo 來替代使用 root 使用者來管理了。