## 13.2 帳號管理
好啦!既然要管理帳號,當然是由新增與移除使用者開始的啰~下面我們就分別來談一談如何新增、 移除與更改使用者的相關信息吧~
### 13.2.1 新增與移除使用者: useradd, 相關配置文件, passwd, usermod, userdel
要如何在 Linux 的系統新增一個使用者啊?呵呵~真是太簡單了~我們登陸系統時會輸入 (1)帳號與 (2)密碼, 所以創建一個可用的帳號同樣的也需要這兩個數據。那帳號可以使用 useradd 來新建使用者,密碼的給予則使用 passwd 這個指令!這兩個指令下達方法如下:
* useradd
```
[root@study ~]# useradd [-u UID] [-g 初始群組] [-G 次要群組] [-mM]\
> [-c 說明欄] [-d 主文件夾絕對路徑] [-s shell] 使用者帳號名
選項與參數:
-u :后面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個帳號;
-g :后面接的那個群組名稱就是我們上面提到的 initial group 啦~
該群組的 GID 會被放置到 /etc/passwd 的第四個字段內。
-G :后面接的群組名稱則是這個帳號還可以加入的群組。
這個選項與參數會修改 /etc/group 內的相關數據喔!
-M :強制!不要創建使用者主文件夾!(系統帳號默認值)
-m :強制!要創建使用者主文件夾!(一般帳號默認值)
-c :這個就是 /etc/passwd 的第五欄的說明內容啦~可以隨便我們設置的啦~
-d :指定某個目錄成為主文件夾,而不要使用默認值。務必使用絕對路徑!
-r :創建一個系統的帳號,這個帳號的 UID 會有限制 (參考 /etc/login.defs)
-s :后面接一個 shell ,若沒有指定則默認是 /bin/bash 的啦~
-e :后面接一個日期,格式為“YYYY-MM-DD”此項目可寫入 shadow 第八字段,
亦即帳號失效日的設置項目啰;
-f :后面接 shadow 的第七字段項目,指定密碼是否會失效。0為立刻失效,
-1 為永遠不失效(密碼只會過期而強制于登陸時重新設置而已。)
范例一:完全參考默認值創建一個使用者,名稱為 vbird1
[root@study ~]# useradd vbird1
[root@study ~]# ll -d /home/vbird1
drwx------. 3 vbird1 vbird1 74 Jul 20 21:50 /home/vbird1
# 默認會創建使用者主文件夾,且權限為 700 !這是重點!
[root@study ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:1003:1004::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:16636:0:99999:7:::
/etc/group:vbird1:x:1004: <==默認會創建一個與帳號一模一樣的群組名
```
其實系統已經幫我們規定好非常多的默認值了,所以我們可以簡單的使用“ useradd 帳號 ”來創建使用者即可。 CentOS 這些默認值主要會幫我們處理幾個項目:
* 在 /etc/passwd 里面創建一行與帳號相關的數據,包括創建 UID/GID/主文件夾等;
* 在 /etc/shadow 里面將此帳號的密碼相關參數填入,但是尚未有密碼;
* 在 /etc/group 里面加入一個與帳號名稱一模一樣的群組名稱;
* 在 /home 下面創建一個與帳號同名的目錄作為使用者主文件夾,且權限為 700
由于在 /etc/shadow 內僅會有密碼參數而不會有加密過的密碼數據,因此我們在創建使用者帳號時, 還需要使用“ passwd 帳號 ”來給予密碼才算是完成了使用者創建的流程。如果由于特殊需求而需要改變使用者相關參數時, 就得要通過上述表格中的選項來進行創建了,參考下面的案例:
```
范例二:假設我已知道我的系統當中有個群組名稱為 users ,且 UID 1500 并不存在,
請用 users 為初始群組,以及 uid 為 1500 來創建一個名為 vbird2 的帳號
[root@study ~]# useradd -u 1500 -g users vbird2
[root@study ~]# ll -d /home/vbird2
drwx------. 3 vbird2 users 74 Jul 20 21:52 /home/vbird2
[root@study ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:16636:0:99999:7:::
# 看一下,UID 與 initial group 確實改變成我們需要的了!
```
在這個范例中,我們創建的是指定一個已經存在的群組作為使用者的初始群組,因為群組已經存在, 所以在 /etc/group 里面就不會主動的創建與帳號同名的群組了! 此外,我們也指定了特殊的 UID 來作為使用者的專屬 UID 喔!了解了一般帳號后,我們來瞧瞧那啥是系統帳號 (system account) 吧!
```
范例三:創建一個系統帳號,名稱為 vbird3
[root@study ~]# useradd -r vbird3
[root@study ~]# ll -d /home/vbird3
ls: cannot access /home/vbird3: No such file or directorya <==不會主動創建主文件夾
[root@study ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:699:699::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:16636::::::
/etc/group:vbird3:x:699:
```
我們在談到 UID 的時候曾經說過一般帳號應該是 1000 號以后,那使用者自己創建的系統帳號則一般是小于 1000 號以下的。 所以在這里我們加上 -r 這個選項以后,系統就會主動將帳號與帳號同名群組的 UID/GID 都指定小于 1000 以下, 在本案例中則是使用 699(UID) 與 699(GID) 啰!此外,由于系統帳號主要是用來進行運行系統所需服務的權限設置, 所以系統帳號默認都不會主動創建主文件夾的!
由這幾個范例我們也會知道,使用 useradd 創建使用者帳號時,其實會更改不少地方,至少我們就知道下面幾個文件:
* 使用者帳號與密碼參數方面的文件:/etc/passwd, /etc/shadow
* 使用者群組相關方面的文件:/etc/group, /etc/gshadow
* 使用者的主文件夾:/home/帳號名稱
那請教一下,你有沒有想過,為何“ useradd vbird1 ”會主動在 /home/vbird1 創建起使用者的主文件夾?主文件夾內有什么數據且來自哪里?為何默認使用的是 /bin/bash 這個 shell ?為何密碼字段已經都規范好了 (0:99999:7 那一串)?呵呵!這就得要說明一下 useradd 所使用的參考文件啰!
* useradd 參考檔
其實 useradd 的默認值可以使用下面的方法調用出來:
```
[root@study ~]# useradd -D
GROUP=100 <==默認的群組
HOME=/home <==默認的主文件夾所在目錄
INACTIVE=-1 <==密碼失效日,在 shadow 內的第 7 欄
EXPIRE= <==帳號失效日,在 shadow 內的第 8 欄
SHELL=/bin/bash <==默認的 shell
SKEL=/etc/skel <==使用者主文件夾的內容數據參考目錄
CREATE_MAIL_SPOOL=yes <==是否主動幫使用者創建郵件信箱(mailbox)
```
這個數據其實是由 /etc/default/useradd 調用出來的!你可以自行用 vim 去觀察該文件的內容。搭配上頭剛剛談過的范例一的運行結果,上面這些設置項目所造成的行為分別是:
* GROUP=100:新建帳號的初始群組使用 GID 為 100 者
系統上面 GID 為 100 者即是 users 這個群組,此設置項目指的就是讓新設使用者帳號的初始群組為 users 這一個的意思。 但是我們知道 CentOS 上面并不是這樣的,在 CentOS 上面默認的群組為與帳號名相同的群組。 舉例來說, vbird1 的初始群組為 vbird1 。怎么會這樣啊?這是因為針對群組的角度有兩種不同的機制所致, 這兩種機制分別是:
* 私有群組機制:
系統會創建一個與帳號一樣的群組給使用者作為初始群組。 這種群組的設置機制會比較有保密性,這是因為使用者都有自己的群組,而且主文件夾權限將會設置為 700 (僅有自己可進入自己的主文件夾) 之故。使用這種機制將不會參考 GROUP=100 這個設置值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;
* 公共群組機制:
就是以 GROUP=100 這個設置值作為新建帳號的初始群組,因此每個帳號都屬于 users 這個群組, 且默認主文件夾通常的權限會是“ drwxr-xr-x ... username users ... ”,由于每個帳號都屬于 users 群組,因此大家都可以互相分享主文件夾內的數據之故。代表 distributions 如 SuSE等。
由于我們的 CentOS 使用私有群組機制,因此這個設置項目是不會生效的!不要太緊張啊!
* HOME=/home:使用者主文件夾的基準目錄(basedir)
使用者的主文件夾通常是與帳號同名的目錄,這個目錄將會擺放在此設置值的目錄后。所以 vbird1 的主文件夾就會在 /home/vbird1/ 了!很容易理解吧!
* INACTIVE=-1:密碼過期后是否會失效的設置值
我們在 [shadow](../Text/index.html#shadow_file) 文件結構當中談過,第七個字段的設置值將會影響到密碼過期后, 在多久時間內還可使用舊密碼登陸。這個項目就是在指定該日數啦!如果是 0 代表密碼過期立刻失效, 如果是 -1 則是代表密碼永遠不會失效,如果是數字,如 30 ,則代表過期 30 天后才失效。
* EXPIRE=:帳號失效的日期
就是 [shadow](../Text/index.html#shadow_file) 內的第八字段,你可以直接設置帳號在哪個日期后就直接失效,而不理會密碼的問題。 通常不會設置此項目,但如果是付費的會員制系統,或許這個字段可以設置喔!
* SHELL=/bin/bash:默認使用的 shell 程序文件名
系統默認的 shell 就寫在這里。假如你的系統為 mail server ,你希望每個帳號都只能使用 email 的收發信件功能, 而不許使用者登陸系統取得 shell ,那么可以將這里設置為 /sbin/nologin ,如此一來,新建的使用者默認就無法登陸! 也免去后續使用 [usermod](../Text/index.html#usermod) 進行修改的手續!
* SKEL=/etc/skel:使用者主文件夾參考基準目錄
這個咚咚就是指定使用者主文件夾的參考基準目錄啰~舉我們的范例一為例, vbird1 主文件夾 /home/vbird1 內的各項數據,都是由 /etc/skel 所復制過去的~所以呢,未來如果我想要讓新增使用者時,該使用者的環境變量 ~/.bashrc 就設置妥當的話,您可以到 /etc/skel/.bashrc 去編輯一下,也可以創建 /etc/skel/www 這個目錄,那么未來新增使用者后,在他的主文件夾下就會有 www 那個目錄了!這樣瞭呼?
* CREATE_MAIL_SPOOL=yes:創建使用者的 mailbox
你可以使用“ ll /var/spool/mail/vbird1 ”看一下,會發現有這個文件的存在喔!這就是使用者的郵件信箱!
除了這些基本的帳號設置值之外, UID/GID 還有密碼參數又是在哪里參考的呢?那就得要看一下 /etc/login.defs 啦! 這個文件的內容有點像下面這樣:
```
MAIL_DIR /var/spool/mail <==使用者默認郵件信箱放置目錄
PASS_MAX_DAYS 99999 <==/etc/shadow 內的第 5 欄,多久需變更密碼日數
PASS_MIN_DAYS 0 <==/etc/shadow 內的第 4 欄,多久不可重新設置密碼日數
PASS_MIN_LEN 5 <==密碼最短的字符長度,已被 pam 模塊取代,失去效用!
PASS_WARN_AGE 7 <==/etc/shadow 內的第 6 欄,過期前會警告的日數
UID_MIN 1000 <==使用者最小的 UID,意即小于 1000 的 UID 為系統保留
UID_MAX 60000 <==使用者能夠用的最大 UID
SYS_UID_MIN 201 <==保留給使用者自行設置的系統帳號最小值 UID
SYS_UID_MAX 999 <==保留給使用者自行設置的系統帳號最大值 UID
GID_MIN 1000 <==使用者自訂群組的最小 GID,小于 1000 為系統保留
GID_MAX 60000 <==使用者自訂群組的最大 GID
SYS_GID_MIN 201 <==保留給使用者自行設置的系統帳號最小值 GID
SYS_GID_MAX 999 <==保留給使用者自行設置的系統帳號最大值 GID
CREATE_HOME yes <==在不加 -M 及 -m 時,是否主動創建使用者主文件夾?
UMASK 077 <==使用者主文件夾創建的 umask ,因此權限會是 700
USERGROUPS_ENAB yes <==使用 userdel 刪除時,是否會刪除初始群組
ENCRYPT_METHOD SHA512 <==密碼加密的機制使用的是 sha512 這一個機制!
```
這個文件規范的數據則是如下所示:
* mailbox 所在目錄:
使用者的默認 mailbox 文件放置的目錄在 /var/spool/mail,所以 vbird1 的 mailbox 就是在 /var/spool/mail/vbird1 啰!
* shadow 密碼第 4, 5, 6 字段內容:
通過 PASS_MAX_DAYS 等等設置值來指定的!所以你知道為何默認的 /etc/shadow 內每一行都會有“ 0:99999:7 ”的存在了嗎?^_^!不過要注意的是,由于目前我們登陸時改用 PAM 模塊來進行密碼檢驗,所以那個 PASS_MIN_LEN 是失效的!
* UID/GID 指定數值:
雖然 Linux 核心支持的帳號可高達 232 這么多個,不過一部主機要作出這么多帳號在管理上也是很麻煩的! 所以在這里就針對 UID/GID 的范圍進行規范就是了。上表中的 UID_MIN 指的就是可登陸系統的一般帳號的最小 UID ,至于 UID_MAX 則是最大 UID 之意。
要注意的是,系統給予一個帳號 UID 時,他是 (1)先參考 UID_MIN 設置值取得最小數值; (2)由 /etc/passwd 搜尋最大的 UID 數值, 將 (1) 與 (2) 相比,找出最大的那個再加一就是新帳號的 UID 了。我們上面已經作出 UID 為 1500 的 vbird2 , 如果再使用“ useradd vbird4 ”時,你猜 vbird4 的 UID 會是多少?答案是: 1501 。 所以中間的 1004~1499 的號碼就空下來啦!
而如果我是想要創建系統用的帳號,所以使用 useradd -r sysaccount 這個 -r 的選項時,就會找“比 201 大但比 1000 小的最大的 UID ”就是了。 ^_^
* 使用者主文件夾設置值:
為何我們系統默認會幫使用者創建主文件夾?就是這個“CREATE_HOME = yes”的設置值啦!這個設置值會讓你在使用 useradd 時, 主動加入“ -m ”這個產生主文件夾的選項啊!如果不想要創建使用者主文件夾,就只能強制加上“ -M ”的選項在 useradd 指令執行時啦!至于創建主文件夾的權限設置呢?就通過 [umask](../Text/index.html#umask) 這個設置值啊!因為是 077 的默認設置,因此使用者主文件夾默認權限才會是“ drwx------ ”哩!
* 使用者刪除與密碼設置值:
使用“USERGROUPS_ENAB yes”這個設置值的功能是: 如果使用 userdel 去刪除一個帳號時,且該帳號所屬的初始群組已經沒有人隸屬于該群組了, 那么就刪除掉該群組,舉例來說,我們剛剛有創建 vbird4 這個帳號,他會主動創建 vbird4 這個群組。 若 vbird4 這個群組并沒有其他帳號將他加入支持的情況下,若使用 userdel vbird4 時,該群組也會被刪除的意思。 至于“ENCRYPT_METHOD SHA512”則表示使用 SHA512 來加密密碼明文,而不使用舊式的 MD5。
現在你知道啦,使用 useradd 這支程序在創建 Linux 上的帳號時,至少會參考:
* /etc/default/useradd
* /etc/login.defs
* /etc/skel/*
這些文件,不過,最重要的其實是創建 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 還有使用者主文件夾就是了~所以,如果你了解整個系統運行的狀態,也是可以手動直接修改這幾個文件就是了。 OK!帳號創建了,接下來處理一下使用者的密碼吧!
* passwd
剛剛我們講到了,使用 useradd 創建了帳號之后,在默認的情況下,該帳號是暫時被封鎖的, 也就是說,該帳號是無法登陸的,你可以去瞧一瞧 /etc/shadow 內的第二個字段就曉得啰~ 那該如何是好?怕什么?直接給他設置新密碼就好了嘛!對吧~設置密碼就使用 passwd 啰!
```
[root@study ~]# passwd [--stdin] [帳號名稱] <==所有人均可使用來改自己的密碼
[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \
> [-n 日數] [-x 日數] [-w 日數] [-i 日期] 帳號 <==root 功能
選項與參數:
--stdin :可以通過來自前一個管線的數據,作為密碼輸入,對 shell script 有幫助!
-l :是 Lock 的意思,會將 /etc/shadow 第二欄最前面加上 ! 使密碼失效;
-u :與 -l 相對,是 Unlock 的意思!
-S :列出密碼相關參數,亦即 shadow 文件內的大部分信息。
-n :后面接天數,shadow 的第 4 字段,多久不可修改密碼天數
-x :后面接天數,shadow 的第 5 字段,多久內必須要更動密碼
-w :后面接天數,shadow 的第 6 字段,密碼過期前的警告天數
-i :后面接“日期”,shadow 的第 7 字段,密碼失效日期
范例一:請 root 給予 vbird2 密碼
[root@study ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: <==這里直接輸入新的密碼,屏幕不會有任何反應
BAD PASSWORD: The password is shorter than 8 characters <==密碼太簡單或過短的錯誤!
Retype new UNIX password: <==再輸入一次同樣的密碼
passwd: all authentication tokens updated successfully. <==竟然還是成功修改了!
```
root 果然是最偉大的人物!當我們要給予使用者密碼時,通過 root 來設置即可。 root 可以設置各式各樣的密碼,系統幾乎一定會接受!所以您瞧瞧,如同上面的范例一,明明鳥哥輸入的密碼太短了, 但是系統依舊可接受 vbird2 這樣的密碼設置。這個是 root 幫忙設置的結果,那如果是使用者自己要改密碼呢? 包括 root 也是這樣修改的喔!
```
范例二:用 vbird2 登陸后,修改 vbird2 自己的密碼
[vbird2@study ~]$ passwd <==后面沒有加帳號,就是改自己的密碼!
Changing password for user vbird2.
Changing password for vbird2
(current) UNIX password: <==這里輸入“原有的舊密碼”
New UNIX password: <==這里輸入新密碼
BAD PASSWORD: The password is shorter than 8 characters <==密碼太短!不可以設置!重新想
New password: <==這里輸入新想的密碼
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
# 同樣的,密碼設置在字典里面找的到該字串,所以也是不建議!無法通過,再想新的!
New UNIX password: <==這里再想個新的密碼來輸入吧
Retype new UNIX password: <==通過密碼驗證!所以重復這個密碼的輸入
passwd: all authentication tokens updated successfully. <==有無成功看關鍵字
```
passwd 的使用真的要很注意,尤其是 root 先生啊!鳥哥在課堂上每次講到這里,說是要幫自己的一般帳號創建密碼時, 有一小部分的學生就是會忘記加上帳號,結果就變成改變 root 自己的密碼,最后.... root 密碼就這樣不見去!唉~ 要幫一般帳號創建密碼需要使用“ passwd 帳號 ”的格式,使用“ passwd ”表示修改自己的密碼!拜托!千萬不要改錯!
與 root 不同的是,一般帳號在更改密碼時需要先輸入自己的舊密碼 (亦即 current 那一行),然后再輸入新密碼 (New 那一行)。 要注意的是,密碼的規范是非常嚴格的,尤其新的 distributions 大多使用 PAM 模塊來進行密碼的檢驗,包括太短、 密碼與帳號相同、密碼為字典常見字串等,都會被 PAM 模塊檢查出來而拒絕修改密碼,此時會再重復出現“ New ”這個關鍵字! 那時請再想個新密碼!若出現“ Retype ”才是你的密碼被接受了!重復輸入新密碼并且看到“ successfully ”這個關鍵字時才是修改密碼成功喔!

**Tips** 與一般使用者不同的是, root 并不需要知道舊密碼就能夠幫使用者或 root 自己創建新密碼! 但如此一來有困擾~就是如果你的親密愛人老是告訴你“我的密碼真難記,幫我設置簡單一點的!”時, 千萬不要妥協啊!這是為了系統安全...
為何使用者要設訂自己的密碼會這么麻煩啊?這是因為密碼的安全性啦!如果密碼設置太簡單, 一些有心人士就能夠很簡單的猜到你的密碼,如此一來人家就可能使用你的一般帳號登陸你的主機或使用其他主機資源, 對主機的維護會造成困擾的!所以新的 distributions 是使用較嚴格的 PAM 模塊來管理密碼,這個管理的機制寫在 /etc/pam.d/passwd 當中。而該文件與密碼有關的測試模塊就是使用:pam_cracklib.so,這個模塊會檢驗密碼相關的信息, 并且取代 /etc/login.defs 內的 PASS_MIN_LEN 的設置啦!關于 PAM 我們在本章后面繼續介紹,這里先談一下, 理論上,你的密碼最好符合如下要求:
* 密碼不能與帳號相同;
* 密碼盡量不要選用字典里面會出現的字串;
* 密碼需要超過 8 個字符;
* 密碼不要使用個人信息,如身份證、手機號碼、其他電話號碼等;
* 密碼不要使用簡單的關系式,如 1+1=2, Iamvbird 等;
* 密碼盡量使用大小寫字符、數字、特殊字符($,_,-等)的組合。
為了方便系統管理,新版的 passwd 還加入了很多創意選項喔!鳥哥個人認為最好用的大概就是這個“ --stdin ”了! 舉例來說,你想要幫 vbird2 變更密碼成為 abc543CC ,可以這樣下達指令呢!
```
范例三:使用 standard input 創建用戶的密碼
[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.
```
這個動作會直接更新使用者的密碼而不用再次的手動輸入!好處是方便處理,缺點是這個密碼會保留在指令中, 未來若系統被攻破,人家可以在 /root/.bash_history 找到這個密碼呢!所以這個動作通常僅用在 shell script 的大量創建使用者帳號當中!要注意的是,這個選項并不存在所有 distributions 版本中, 請使用 man passwd 確認你的 distribution 是否有支持此選項喔!
如果你想要讓 vbird2 的密碼具有相當的規則,舉例來說你要讓 vbird2 每 60 天需要變更密碼, 密碼過期后 10 天未使用就宣告帳號失效,那該如何處理?
```
范例四:管理 vbird2 的密碼使具有 60 天變更、密碼過期 10 天后帳號失效的設置
[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 99999 7 -1 (Password set, SHA512 crypt.)
# 上面說明密碼創建時間 (2015-07-20)、0 最小天數、99999 變更天數、7 警告日數與密碼不會失效 (-1)
[root@study ~]# passwd -x 60 -i 10 vbird2
[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 60 7 10 (Password set, SHA512 crypt.)
```
那如果我想要讓某個帳號暫時無法使用密碼登陸主機呢?舉例來說, vbird2 這家伙最近老是胡亂在主機亂來, 所以我想要暫時讓她無法登陸的話,最簡單的方法就是讓她的密碼變成不合法 (shadow 第 2 字段長度變掉)! 處理的方法就更簡單的!
```
范例五:讓 vbird2 的帳號失效,觀察完畢后再讓她失效
[root@study ~]# passwd -l vbird2
[root@study ~]# passwd -S vbird2
vbird2 LK 2015-07-20 0 60 7 10 (Password locked.)
# 嘿嘿!狀態變成“ LK, Lock ”了啦!無法登陸喔!
[root@study ~]# grep vbird2 /etc/shadow
vbird2:!!$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::
# 其實只是在這里加上 !! 而已!
[root@study ~]# passwd -u vbird2
[root@study ~]# grep vbird2 /etc/shadow
vbird2:$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::
# 密碼字段恢復正常!
```
是否很有趣啊!您可以自行管理一下你的帳號的密碼相關參數喔!接下來讓我們用更簡單的方法來查閱密碼參數喔!
* chage
除了使用 passwd -S 之外,有沒有更詳細的密碼參數顯示功能呢?有的!那就是 chage 了!他的用法如下:
```
[root@study ~]# chage [-ldEImMW] 帳號名
選項與參數:
-l :列出該帳號的詳細密碼參數;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密碼的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(帳號失效日),格式 YYYY-MM-DD
-I :后面接天數,修改 shadow 第七字段(密碼失效日期)
-m :后面接天數,修改 shadow 第四字段(密碼最短保留天數)
-M :后面接天數,修改 shadow 第五字段(密碼多久需要進行變更)
-W :后面接天數,修改 shadow 第六字段(密碼過期前警告日期)
范例一:列出 vbird2 的詳細密碼參數
[root@study ~]# chage -l vbird2
Last password change : Jul 20, 2015
Password expires : Sep 18, 2015
Password inactive : Sep 28, 2015
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
```
我們在 [passwd](../Text/index.html#passwd) 的介紹中談到了處理 vbird2 這個帳號的密碼屬性流程,使用 passwd -S 卻無法看到很清楚的說明。如果使用 chage 那可就明白多了!如上表所示,我們可以清楚的知道 vbird2 的詳細參數呢! 如果想要修改其他的設置值,就自己參考上面的選項,或者自行 man chage 一下吧!^_^
chage 有一個功能很不錯喔!如果你想要讓“使用者在第一次登陸時, 強制她們一定要更改密碼后才能夠使用系統資源”,可以利用如下的方法來處理的!
```
范例二:創建一個名為 agetest 的帳號,該帳號第一次登陸后使用默認密碼,但必須要更改過密碼后,
使用新密碼才能夠登陸系統使用 bash 環境
[root@study ~]# useradd agetest
[root@study ~]# echo "agetest" | passwd --stdin agetest
[root@study ~]# chage -d 0 agetest
[root@study ~]# chage -l agetest | head -n 3
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
# 此時此帳號的密碼創建時間會被改為 1970/1/1 ,所以會有問題!
范例三:嘗試以 agetest 登陸的情況
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Changing password for agetest
(current) UNIX password: <==這個帳號被強制要求必須要改密碼!
```
非常有趣吧!你會發現 agetest 這個帳號在第一次登陸時可以使用與帳號同名的密碼登陸, 但登陸時就會被要求立刻更改密碼,更改密碼完成后就會被踢出系統。再次登陸時就能夠使用新密碼登陸了! 這個功能對學校老師非常有幫助!因為我們不想要知道學生的密碼,那么在初次上課時就使用與學號相同的帳號/密碼給學生, 讓她們登陸時自行設置她們的密碼,如此一來就能夠避免其他同學隨意使用別人的帳號,也能夠保證學生知道如何更改自己的密碼!
* usermod
所謂這“人有失手,馬有亂蹄”,您說是吧?所以啰,當然有的時候會“不小心手滑了一下”在 useradd 的時候加入了錯誤的設置數據。或者是,在使用 useradd 后,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應字段的數據, 不過,Linux 也有提供相關的指令讓大家來進行帳號相關數據的微調呢~那就是 usermod 啰~
```
[root@study ~]# usermod [-cdegGlsuLU] username
選項與參數:
-c :后面接帳號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些帳號的說明。
-d :后面接帳號的主文件夾,即修改 /etc/passwd 的第六欄;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個字段數據啦!
-f :后面接天數,為 shadow 的第七字段。
-g :后面接初始群組,修改 /etc/passwd 的第四個字段,亦即是 GID 的字段!
-G :后面接次要群組,修改這個使用者能夠支持的群組,修改的是 /etc/group 啰~
-a :與 -G 合用,可“增加次要群組的支持”而非“設置”喔!
-l :后面接帳號名稱。亦即是修改帳號名稱, /etc/passwd 的第一欄!
-s :后面接 Shell 的實際文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 數字啦!即 /etc/passwd 第三欄的數據;
-L :暫時將使用者的密碼凍結,讓他無法登陸。其實僅改 /etc/shadow 的密碼欄。
-U :將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
```
如果你仔細的比對,會發現 usermod 的選項與 [useradd](../Text/index.html#useradd) 非常類似! 這是因為 usermod 也是用來微調 useradd 增加的使用者參數嘛!不過 usermod 還是有新增的選項, 那就是 -L 與 -U ,不過這兩個選項其實與 passwd 的 -l, -u 是相同的!而且也不見得會存在所有的 distribution 當中!接下來,讓我們談談一些變更參數的實例吧!
```
范例一:修改使用者 vbird2 的說明欄,加上“VBird's test”的說明。
[root@study ~]# usermod -c "VBird's test" vbird2
[root@study ~]# grep vbird2 /etc/passwd
vbird2:x:1500:100:VBird's test:/home/vbird2:/bin/bash
范例二:使用者 vbird2 這個帳號在 2015/12/31 失效。
[root@study ~]# usermod -e "2015-12-31" vbird2
[root@study ~]# chage -l vbird2 | grep 'Account expires'
Account expires : Dec 31, 2015
范例三:我們創建 vbird3 這個系統帳號時并沒有給予主文件夾,請創建他的主文件夾
[root@study ~]# ll -d ~vbird3
ls: cannot access /home/vbird3: No such file or directory <==確認一下,確實沒有主文件夾的存在!
[root@study ~]# cp -a /etc/skel /home/vbird3
[root@study ~]# chown -R vbird3:vbird3 /home/vbird3
[root@study ~]# chmod 700 /home/vbird3
[root@study ~]# ll -a ~vbird3
drwx------. 3 vbird3 vbird3 74 May 4 17:51 . <==使用者主文件夾權限
drwxr-xr-x. 10 root root 4096 Jul 20 22:51 ..
-rw-r--r--. 1 vbird3 vbird3 18 Mar 6 06:06 .bash_logout
-rw-r--r--. 1 vbird3 vbird3 193 Mar 6 06:06 .bash_profile
-rw-r--r--. 1 vbird3 vbird3 231 Mar 6 06:06 .bashrc
drwxr-xr-x. 4 vbird3 vbird3 37 May 4 17:51 .mozilla
# 使用 chown -R 是為了連同主文件夾下面的使用者/群組屬性都一起變更的意思;
# 使用 chmod 沒有 -R ,是因為我們僅要修改目錄的權限而非內部文件的權限!
```
* userdel
這個功能就太簡單了,目的在刪除使用者的相關數據,而使用者的數據有:
* 使用者帳號/密碼相關參數:/etc/passwd, /etc/shadow
* 使用者群組相關參數:/etc/group, /etc/gshadow
* 使用者個人文件數據: /home/username, /var/spool/mail/username..
整個指令的語法非常簡單:
```
[root@study ~]# userdel [-r] username
選項與參數:
-r :連同使用者的主文件夾也一起刪除
范例一:刪除 vbird2 ,連同主文件夾一起刪除
[root@study ~]# userdel -r vbird2
```
這個指令下達的時候要小心了!通常我們要移除一個帳號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 里頭的該帳號取消即可!一般而言,如果該帳號只是“暫時不啟用”的話,那么將 /etc/shadow 里頭帳號失效日期 (第八字段) 設置為 0 就可以讓該帳號無法使用,但是所有跟該帳號相關的數據都會留下來! 使用 userdel 的時機通常是“你真的確定不要讓該用戶在主機上面使用任何數據了!”
另外,其實使用者如果在系統上面操作過一陣子了,那么該使用者其實在系統內可能會含有其他文件的。 舉例來說,他的郵件信箱 (mailbox) 或者是[例行性工作調度 (crontab, 十五章)](../Text/index.html) 之類的文件。 所以,如果想要完整的將某個帳號完整的移除,最好可以在下達 userdel -r username 之前, 先以“ find / -user username ”查出整個系統內屬于 username 的文件,然后再加以刪除吧!
### 13.2.2 使用者功能
不論是 useradd/usermod/userdel ,那都是系統管理員所能夠使用的指令, 如果我是一般身份使用者,那么我是否除了密碼之外,就無法更改其他的數據呢? 當然不是啦!這里我們介紹幾個一般身份使用者常用的帳號數據變更與查詢指令啰!
* id
id 這個指令則可以查詢某人或自己的相關 UID/GID 等等的信息,他的參數也不少,不過,都不需要記~反正使用 id 就全部都列出啰! 另外,也回想一下,我們在前一章談到的循環時,就有用過這個指令喔! ^_^
```
[root@study ~]# id [username]
范例一:查閱 root 自己的相關 ID 信息!
[root@study ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:
s0-s0:c0.c1023
# 上面信息其實是同一行的數據!包括會顯示 UID/GID 以及支持的所有群組!
# 至于后面那個 context=... 則是 SELinux 的內容,先不要理會他!
范例二:查閱一下 vbird1 吧~
[root@study ~]# id vbird1
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1)
[root@study ~]# id vbird100
id: vbird100: No such user <== id 這個指令也可以用來判斷系統上面有無某帳號!
```
* finger
finger 的中文字面意義是:“手指”或者是“指紋”的意思。這個 finger 可以查閱很多使用者相關的信息喔! 大部分都是在 /etc/passwd 這個文件里面的信息啦!不過,這個指令有點危險,所以新的版本中已經默認不安裝這個軟件! 好啦!現在繼續來安裝軟件先~記得[第九章 dos2unix](../Text/index.html#tips_dos) 的安裝方式! 假設你已經將光驅或光盤鏡像文件掛載在 /mnt 下面了,所以:
```
[root@study ~]# df -hT /mnt
Filesystem Type Size Used Avail Use% Mounted on
/dev/sr0 iso9660 7.1G 7.1G 0 100% /mnt # 先確定是有掛載光盤的啦!
[root@study ~]# rpm -ivh /mnt/Packages/finger-[0-9]*
```
我們就先來檢查檢查使用者信息吧!
```
[root@study ~]# finger [-s] username
選項與參數:
-s :僅列出使用者的帳號、全名、終端機代號與登陸時間等等;
-m :列出與后面接的帳號相同者,而不是利用部分比對 (包括全名部分)
范例一:觀察 vbird1 的使用者相關帳號屬性
[root@study ~]# finger vbird1
Login: vbird1 Name:
Directory: /home/vbird1 Shell: /bin/bash
Never logged in.
No mail.
No Plan.
```
由于 finger 類似指紋的功能,他會將使用者的相關屬性列出來!如上表所示,其實他列出來的幾乎都是 /etc/passwd 文件里面的東西。列出的信息說明如下:
* Login:為使用者帳號,亦即 /etc/passwd 內的第一字段;
* Name:為全名,亦即 /etc/passwd 內的第五字段(或稱為注解);
* Directory:就是主文件夾了;
* Shell:就是使用的 Shell 文件所在;
* Never logged in.:figner 還會調查使用者登陸主機的情況喔!
* No mail.:調查 /var/spool/mail 當中的信箱數據;
* No Plan.:調查 ~vbird1/.plan 文件,并將該文件取出來說明!
不過是否能夠查閱到 Mail 與 Plan 則與權限有關了!因為 Mail / Plan 都是與使用者自己的權限設置有關, root 當然可以查閱到使用者的這些信息,但是 vbird1 就不見得能夠查到 vbird3 的信息, 因為 /var/spool/mail/vbird3 與 /home/vbird3/ 的權限分別是 660, 700 ,那 vbird1 當然就無法查閱的到! 這樣解釋可以理解吧?此外,我們可以創建自己想要執行的預定計劃,當然,最多是給自己看的!可以這樣做:
```
范例二:利用 vbird1 創建自己的計劃檔
[vbird1@study ~]$ echo "I will study Linux during this year." > ~/.plan
[vbird1@study ~]$ finger vbird1
Login: vbird1 Name:
Directory: /home/vbird1 Shell: /bin/bash
Last login Mon Jul 20 23:06 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.
范例三:找出目前在系統上面登陸的使用者與登陸時間
[vbird1@study ~]$ finger
Login Name Tty Idle Login Time Office Office Phone Host
dmtsai dmtsai tty2 11d Jul 7 23:07
dmtsai dmtsai pts/0 Jul 20 17:59
```
在范例三當中,我們發現輸出的信息還會有 Office, Office Phone 等信息,那這些信息要如何記錄呢? 下面我們會介紹 chfn 這個指令!來看看如何修改使用者的 finger 數據吧!
* chfn
chfn 有點像是: change finger 的意思!這玩意的使用方法如下:
```
[root@study ~]# chfn [-foph] [帳號名]
選項與參數:
-f :后面接完整的大名;
-o :您辦公室的房間號碼;
-p :辦公室的電話號碼;
-h :家里的電話號碼!
范例一:vbird1 自己更改一下自己的相關信息!
[vbird1@study ~]$ chfn
Changing finger information for vbird1.
Name []: VBird Tsai test <==輸入你想要呈現的全名
Office []: DIC in KSU <==辦公室號碼
Office Phone []: 06-2727175#356 <==辦公室電話
Home Phone []: 06-1234567 <==家里電話號碼
Password: <==確認身份,所以輸入自己的密碼
Finger information changed.
[vbird1@study ~]$ grep vbird1 /etc/passwd
vbird1:x:1003:1004:VBird Tsai test,DIC in KSU,06-2727175#356,06-1234567:/home/vbird1:/bin/bash
# 其實就是改到第五個字段,該字段里面用多個“ , ”分隔就是了!
[vbird1@study ~]$ finger vbird1
Login: vbird1 Name: VBird Tsai test
Directory: /home/vbird1 Shell: /bin/bash
Office: DIC in KSU, 06-2727175#356 Home Phone: 06-1234567
Last login Mon Jul 20 23:12 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.
# 就是上面特殊字體呈現的那些地方是由 chfn 所修改出來的!
```
這個指令說實在的,除非是你的主機有很多的用戶,否則倒真是用不著這個程序!這就有點像是 bbs 里頭更改你“個人屬性”的那一個數據啦!不過還是可以自己玩一玩!尤其是用來提醒自己相關數據啦! ^_^
* chsh
這就是 change shell 的簡寫!使用方法就更簡單了!
```
[vbird1@study ~]$ chsh [-ls]
選項與參數:
-l :列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容!
-s :設置修改自己的 Shell 啰
范例一:用 vbird1 的身份列出系統上所有合法的 shell,并且指定 csh 為自己的 shell
[vbird1@study ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin <==所謂:合法不可登陸的 Shell 就是這玩意!
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh <==這就是 C shell 啦!
# 其實上面的信息就是我們在 [bash](../Text/index.html) 中談到的 /etc/shells 啦!
[vbird1@study ~]$ chsh -s /bin/csh; grep vbird1 /etc/passwd
Changing shell for vbird1.
Password: <==確認身份,請輸入 vbird1 的密碼
Shell changed.
vbird1:x:1003:1004:VBird Tsai test,DIC in KSU,06-2727175#356,06-1234567:/home/vbird1:/bin/csh
[vbird1@study ~]$ chsh -s /bin/bash
# 測試完畢后,立刻改回來!
[vbird1@study ~]$ ll $(which chsh)
-rws--x--x. 1 root root 23856 Mar 6 13:59 /bin/chsh
```
不論是 chfn 與 chsh ,都是能夠讓一般使用者修改 /etc/passwd 這個系統文件的!所以你猜猜,這兩個文件的權限是什么? 一定是 [SUID](../Text/index.html#suid) 的功能啦!看到這里,想到前面! 這就是 Linux 的學習方法~ ^_^
### 13.2.3 新增與移除群組
OK!了解了帳號的新增、刪除、更動與查詢后,再來我們可以聊一聊群組的相關內容了。 基本上,群組的內容都與這兩個文件有關:/etc/group, /etc/gshadow。 群組的內容其實很簡單,都是上面兩個文件的新增、修改與移除而已, 不過,如果再加上有效群組的概念,那么 newgrp 與 gpasswd 則不可不知呢!
* groupadd
```
[root@study ~]# groupadd [-g gid] [-r] 群組名稱
選項與參數:
-g :后面接某個特定的 GID ,用來直接給予某個 GID ~
-r :創建系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。
范例一:新建一個群組,名稱為 group1
[root@study ~]# groupadd group1
[root@study ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1503:
/etc/gshadow:group1:!::
# 群組的 GID 也是會由 1000 以上最大 GID+1 來決定!
```
曾經有某些版本的教育訓練手冊談到,為了讓使用者的 UID/GID 成對,她們建議新建的與使用者私有群組無關的其他群組時,使用小于 1000 以下的 GID 為宜。 也就是說,如果要創建群組的話,最好能夠使用“ groupadd -r 群組名”的方式來創建啦! 不過,這見仁見智啦!看你自己的抉擇啰!
* groupmod
跟 [usermod](../Text/index.html#usermod) 類似的,這個指令僅是在進行 group 相關參數的修改而已。
```
[root@study ~]# groupmod [-g gid] [-n group_name] 群組名
選項與參數:
-g :修改既有的 GID 數字;
-n :修改既有的群組名稱
范例一:將剛剛上個指令創建的 group1 名稱改為 mygroup , GID 為 201
[root@study ~]# groupmod -g 201 -n mygroup group1
[root@study ~]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::
```
不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!
* groupdel
呼呼! groupdel 自然就是在刪除群組的啰~用法很簡單:
```
[root@study ~]# groupdel [groupname]
范例一:將剛剛的 mygroup 刪除!
[root@study ~]# groupdel mygroup
范例二:若要刪除 vbird1 這個群組的話?
[root@study ~]# groupdel vbird1
groupdel: cannot remove the primary group of user 'vbird1'
```
為什么 mygroup 可以刪除,但是 vbird1 就不能刪除呢?原因很簡單,“有某個帳號 (/etc/passwd) 的 initial group 使用該群組!” 如果查閱一下,你會發現在 /etc/passwd 內的 vbird1 第四欄的 GID 就是 /etc/group 內的 vbird1 那個群組的 GID ,所以啰,當然無法刪除~否則 vbird1 這個使用者登陸系統后, 就會找不到 GID ,那可是會造成很大的困擾的!那么如果硬要刪除 vbird1 這個群組呢? 你“必須要確認 /etc/passwd 內的帳號沒有任何人使用該群組作為 initial group ”才行喔!所以,你可以:
* 修改 vbird1 的 GID ,或者是:
* 刪除 vbird1 這個使用者。
* gpasswd:群組管理員功能
如果系統管理員太忙碌了,導致某些帳號想要加入某個專案時找不到人幫忙!這個時候可以創建“群組管理員”喔! 什么是群組管理員呢?就是讓某個群組具有一個管理員,這個群組管理員可以管理哪些帳號可以加入/移出該群組! 那要如何“創建一個群組管理員”呢?就得要通過 gpasswd 啰!
```
# 關于系統管理員(root)做的動作:
[root@study ~]# gpasswd groupname
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@study ~]# gpasswd [-rR] groupname
選項與參數:
:若沒有任何參數時,表示給予 groupname 一個密碼(/etc/gshadow)
-A :將 groupname 的主控權交由后面的使用者管理(該群組的管理員)
-M :將某些帳號加入這個群組當中!
-r :將 groupname 的密碼移除
-R :讓 groupname 的密碼欄失效
# 關于群組管理員(Group administrator)做的動作:
[someone@study ~]$ gpasswd [-ad] user groupname
選項與參數:
-a :將某位使用者加入到 groupname 這個群組當中!
-d :將某位使用者移除出 groupname 這個群組當中。
范例一:創建一個新群組,名稱為 testgroup 且群組交由 vbird1 管理:
[root@study ~]# groupadd testgroup <==先創建群組
[root@study ~]# gpasswd testgroup <==給這個群組一個密碼吧!
Changing the password for group testgroup
New Password:
Re-enter new password:
# 輸入兩次密碼就對了!
[root@study ~]# gpasswd -A vbird1 testgroup <==加入群組管理員為 vbird1
[root@study ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1503:
/etc/gshadow:testgroup:$6$MnmChP3D$mrUn.Vo.buDjObMm8F2emTkvGSeuWikhRzaKHxpJ...:vbird1:
# 很有趣吧!此時 vbird1 則擁有 testgroup 的主控權喔!身份有點像板主啦!
范例二:以 vbird1 登陸系統,并且讓他加入 vbird1, vbird3 成為 testgroup 成員
[vbird1@study ~]$ id
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1) ...
# 看得出來,vbird1 尚未加入 testgroup 群組喔!
[vbird1@study ~]$ gpasswd -a vbird1 testgroup
[vbird1@study ~]$ gpasswd -a vbird3 testgroup
[vbird1@study ~]$ grep testgroup /etc/group
testgroup:x:1503:vbird1,vbird3
```
很有趣的一個小實驗吧!我們可以讓 testgroup 成為一個可以公開的群組,然后創建起群組管理員, 群組管理員可以有多個。在這個案例中,我將 vbird1 設置為 testgroup 的群組管理員,所以 vbird1 就可以自行增加群組成員啰~呼呼!然后,該群組成員就能夠使用 [newgrp](../Text/index.html#newgrp) 啰~
### 13.2.4 帳號管理實例
帳號管理不是隨意創建幾個帳號就算了!有時候我們需要考慮到一部主機上面可能有多個帳號在協同工作! 舉例來說,在大學任教時,我們學校的專題生是需要分組的,這些同一組的同學間必須要能夠互相修改對方的數據文件, 但是同時這些同學又需要保留自己的私密數據,因此直接公開主文件夾是不適宜的。那該如何是好? 為此,我們下面提供幾個例子來讓大家思考看看啰:
任務一:單純的完成上頭交代的任務,假設我們需要的帳號數據如下,你該如何實作?
| 帳號名稱 | 帳號全名 | 支持次要群組 | 是否可登陸主機 | 密碼 |
| --- | --- |
| myuser1 | 1st user | mygroup1 | 可以 | password |
| myuser2 | 2nd user | mygroup1 | 可以 | password |
| myuser3 | 3rd user | 無額外支持 | 不可以 | password |
處理的方法如下所示:
```
# 先處理帳號相關屬性的數據:
[root@study ~]# groupadd mygroup1
[root@study ~]# useradd -G mygroup1 -c "1st user" myuser1
[root@study ~]# useradd -G mygroup1 -c "2nd user" myuser2
[root@study ~]# useradd -c "3rd user" -s /sbin/nologin myuser3
# 再處理帳號的密碼相關屬性的數據:
[root@study ~]# echo "password" | passwd --stdin myuser1
[root@study ~]# echo "password" | passwd --stdin myuser2
[root@study ~]# echo "password" | passwd --stdin myuser3
```
要注意的地方主要有:myuser1 與 myuser2 都有支持次要群組,但該群組不見得會存在,因此需要先手動創建他! 然后 myuser3 是“不可登陸系統”的帳號,因此需要使用 /sbin/nologin 這個 shell 來給予,這樣該帳號就無法登陸啰! 這樣是否理解啊!接下來再來討論比較難一些的環境!如果是專題環境該如何制作?
任務二:我的使用者 pro1, pro2, pro3 是同一個專案計劃的開發人員,我想要讓這三個用戶在同一個目錄下面工作, 但這三個用戶還是擁有自己的主文件夾與基本的私有群組。假設我要讓這個專案計劃在 /srv/projecta 目錄下開發, 可以如何進行?
```
# 1\. 假設這三個帳號都尚未創建,可先創建一個名為 projecta 的群組,
# 再讓這三個用戶加入其次要群組的支持即可:
[root@study ~]# groupadd projecta
[root@study ~]# useradd -G projecta -c "projecta user" pro1
[root@study ~]# useradd -G projecta -c "projecta user" pro2
[root@study ~]# useradd -G projecta -c "projecta user" pro3
[root@study ~]# echo "password" | passwd --stdin pro1
[root@study ~]# echo "password" | passwd --stdin pro2
[root@study ~]# echo "password" | passwd --stdin pro3
# 2\. 開始創建此專案的開發目錄:
[root@study ~]# mkdir /srv/projecta
[root@study ~]# chgrp projecta /srv/projecta
[root@study ~]# chmod 2770 /srv/projecta
[root@study ~]# ll -d /srv/projecta
drwxrws---. 2 root projecta 6 Jul 20 23:32 /srv/projecta
```
由于此專案計劃只能夠給 pro1, pro2, pro3 三個人使用,所以 /srv/projecta 的權限設置一定要正確才行! 所以該目錄群組一定是 projecta ,但是權限怎么會是 2770 呢還記得[第六章談到的 SGID](../Text/index.html#sgid) 吧?為了讓三個使用者能夠互相修改對方的文件, 這個 SGID 是必須要存在的喔!如果連這里都能夠理解,嘿嘿!您的帳號管理已經有一定程度的概念啰! ^_^
但接下來有個困擾的問題發生了!假如任務一的 myuser1 是 projecta 這個專案的助理,他需要這個專案的內容, 但是他“不可以修改”專案目錄內的任何數據!那該如何是好?你或許可以這樣做:
* 將 myuser1 加入 projecta 這個群組的支持,但是這樣會讓 myuser1 具有完整的 /srv/projecta 的使用權限, myuser1 是可以刪除該目錄下的任何數據的!這樣是有問題的;
* 將 /srv/projecta 的權限改為 2775 ,讓 myuser1 可以進入查閱數據。但此時會發生所有其他人均可進入該目錄查閱的困擾! 這也不是我們要的環境。
真要命!傳統的 Linux 權限無法針對某個個人設置專屬的權限嗎?其實是可以啦!接下來我們就來談談這個功能吧!
### 13.2.5 使用外部身份認證系統
在談 ACL 之前,我們再來談一個概念性的操作~因為我們目前沒有服務器可供練習....
有時候,除了本機的帳號之外,我們可能還會使用到其他外部的身份驗證服務器所提供的驗證身份的功能!舉例來說, windows 下面有個很有名的身份驗證系統,稱為 Active Directory (AD)的東西,還有 Linux 為了提供不同主機使用同一組帳號密碼, 也會使用到 LDAP, NIS 等服務器提供的身份驗證等等!
如果你的 Linux 主機要使用到上面提到的這些外部身份驗證系統時,可能就得要額外的設置一些數據了! 為了簡化使用者的操作流程,所以 CentOS 提供一只名為 authconfig-tui 的指令給我們參考,這個指令的執行結果如下:
圖13.2.1、使用外部身份驗證服務器的方式
你可以在該畫面中使用 [tab] 按鈕在各個項目中間切換,不過,因為我們沒有適用的服務器可以測試,因此這里僅是提供一個參考的依據, 未來如果談到服務器章節時,你要如果談到服務器章節時,服器有印象,處理外部身份驗證的方式可以通過 authconfig-tui 就好了! 上圖中最多可供操作的,大概僅有支持 MD5 這個早期的密碼格式就是了!此外,不要隨便將已經啟用的項目 (上頭有星號 * 的項目) 取消喔! 可能某些帳號會失效...
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀