home products tech support contact us

 Linux 技術支援    ⇒   基礎篇    進階篇    補腦篇    指令索引    中⇒ENG
版權所有, 引用請註明出處

 帳號管理

1.0 帳號管理
       了解帳號相關設定檔
           /etc/passwd
           /etc/shadow
       passwd 變更密碼
       useradd 新增帳號
       useradel 刪除帳號
       vipw 修改 /etc/passwd
       usermod 修改帳號
1.1 個人帳號修改
        chfn 修改 finger 指令顯示資訊
        chsh 修改登入 Shell
        finger 查詢帳號
1.2 其他帳號相關指令
       id 顯示帳號 ID
       who/w 顯示登入者資訊
       lastlog 帳號登錄查詢


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

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

了解帳號相關設定檔
由於帳號管理是屬於系統管理員的工作,記得要用〝root〞帳號登入才可完成大部分的操作,且設定帳號大多是維護和變更二個重要的帳號設定檔〝/etc/passwd〞和〝/etc/shadow〞等,故有必要先了解這二個和帳號密切相關的設定檔的定義。

^ back on top ^

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〞

^ back on top ^

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〞)

^ back on top ^

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 一並刪除

^ back on top ^

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〞可加超過一個以上的附加群組。

^ back on top ^

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

^ back on top ^




;
 

 1.2 其他帳號相關指令
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 ←也可顯示其他帳號資訊

^ back on top ^

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

who 用法如下:
語法:id [-otpiton][--option]
指令名稱/功能/命令使用者 選項 功能
who/( who is logged on)顯示登入資訊 /
Any
-a all
-b 最後開機時間
-d 顯示死進程(dead processes)
-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 的〝時差〞。