介紹如何在 Linux 中清查系統上所有的使用者帳號,列出一般使用者的帳號清單。
/etc/passwd
檔案
Linux 的 /etc/passwd
檔案中記錄了系統上所有的帳號,所以我們可以從其中查閱整個系統的所有帳號:
# 輸出 /etc/passwd 檔案內容
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin [略]
在 /etc/passwd
檔案的內容中,每一行就是一個帳號,第一個冒號之前的部分就是使用者帳號名稱。
亦可使用 more
或 less
來查閱 /etc/passwd
檔案內容:
# 查閱 /etc/passwd 檔案內容
less /etc/passwd
產生帳號清單
我們可以利用 cut
指令將 /etc/passwd
中的帳號名稱取出,產生一份帳號清單:
# 產生所有帳號的清單 cut -d: -f1 /etc/passwd
root daemon bin sys sync games man lp mail [略]
以下 awk
指令亦可達到相同的效果:
# 產生所有帳號的清單 awk -F: '{print $1}' /etc/passwd
getent
指令
getent
指令也可以用來查詢系統上的帳號清單:
# 輸出 passwd 資料庫
getent passwd
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin [略]
將 getent
指令的輸出導向至 cut
或 awk
產生帳號清單:
# 產生所有帳號的清單 getent passwd | cut -d: -f1 # 產生所有帳號的清單 getent passwd | awk -F: '{print $1}'
root daemon bin sys sync games man lp mail [略]
檢查指定使用者帳號
若要檢查指定的使用者帳號資訊,可以執行:
# 查詢指定帳號資訊 getent passwd myuser
myuser:x:1001:1001:My User,123,02-12345678,03-1234567:/home/myuser:/bin/bash
如果指定的使用者帳號不存在,就不會有任何輸出訊息。
統計帳號數量
若要統計整個系統上有多少帳號,可以搭配 wc
指令:
# 統計帳號數量 getent passwd | wc -l
48
系統帳號與一般使用者帳號
系統帳號是用於系統服務或軟體,而一般使用者帳號則是給實際的使用者登入使用,在本質上兩者並沒有太大的差異。
在建立一般使用者帳號時,系統會自動根據 /etc/login.defs
中 UID_MIN
與 UID_MAX
的設定值,選擇使用者帳號的 UID,通常來說一般使用者帳號的 UID 都會選在這個區間之內。
# 檢查 UID_MIN 與 UID_MAX 設定值 grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
UID_MIN 1000 UID_MAX 60000
透過這個規則,我們就可以列出系統上所有的一般使用者帳號(UID 介於 UID_MIN
與 UID_MAX
的使用者):
# 查詢一般使用者帳號資訊 getent passwd {1000..60000}
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash myuser:x:1001:1001:My User,123,02-12345678,03-1234567:/home/myuser:/bin/bash
我們可以將查詢 UID_MIN
與 UID_MAX
的動作一起放進來,變成單一指令:
# 查詢一般使用者帳號資訊 eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)}
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash myuser:x:1001:1001:My User,123,02-12345678,03-1234567:/home/myuser:/bin/bash
再配合 cut
指令即可產生一般使用者的帳號清單:
# 產生一般使用者帳號清單 eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1
ubuntu myuser