精確找出 Linux 系統中的特定使用者帳號
如何列出登入 Shell 為 /bin/bash 且 UID 大於 1000 的 Linux 使用者?
在 Linux 系統管理中,經常需要根據特定條件篩選使用者帳號。您的查詢要求列出所有預設登入 Shell 設定為 /bin/bash 且使用者 ID (UID) 大於 1000 的帳號。這通常對應於系統上具有標準互動式 Shell 存取權限的一般人類使用者。
核心要點
- 目標使用者類型: 查詢旨在識別系統上的「一般使用者」(UID > 1000),他們使用最常見的互動式 Shell
/bin/bash。 - 關鍵資訊來源: 使用者帳號資訊主要儲存在
/etc/passwd檔案中,每一行代表一個帳號,包含 UID 和預設 Shell 等欄位。 - 推薦工具與指令: 使用
getent passwd結合awk是最可靠且全面的方法,可以處理本地及可能的網路帳號(如 LDAP),並根據多個條件進行精確篩選。
理解查詢條件
要有效地列出符合條件的使用者,首先需要了解查詢中兩個關鍵條件的意義:UID > 1000 和 Shell 為 /bin/bash。
/etc/passwd 檔案結構解析
Linux 系統將使用者帳號的基本資訊存放在 /etc/passwd 檔案裡。這個文字檔案的每一行都對應一個使用者帳號,並且包含由冒號 (:) 分隔的多個欄位。其標準格式如下:
使用者名稱:密碼佔位符:UID:GID:使用者資訊(GECOS):家目錄:登入 Shell
- 使用者名稱 (Username): 登入系統時使用的名稱。
- 密碼佔位符 (Password Placeholder): 通常顯示為 'x',表示加密後的密碼儲存在更安全的
/etc/shadow檔案中。 - 使用者 ID (UID): 系統內部用來識別使用者的唯一數字 ID。這是我們篩選條件之一。
- 群組 ID (GID): 使用者所屬主要群組的數字 ID。
- 使用者資訊 (GECOS): 可選欄位,通常包含使用者全名或其他描述性資訊。
- 家目錄 (Home Directory): 使用者登入後預設的工作目錄路徑。
- 登入 Shell (Login Shell): 使用者登入後啟動的預設命令列介面程式路徑。這是我們篩選的另一個條件 (
/bin/bash)。
為何篩選 UID > 1000?
使用者 ID (UID) 是 Linux 系統區分不同帳號的關鍵。按照 Linux 標準基底 (LSB) 和多數發行版(如 Ubuntu, Debian, RHEL 7+)的慣例,UID 的分配有特定範圍:
- UID 0: 保留給 root 超級使用者。
- UID 1-999: 通常保留給系統帳號和服務。這些帳號用於執行背景服務或系統任務,通常不允許互動式登入。
- UID 1000 及以上: 分配給一般使用者帳號。這些是系統管理員為實際操作電腦的人類使用者建立的帳號。
因此,篩選 UID > 1000 的目的是排除系統帳號和 root,專注於找出系統上的一般使用者。請注意,有些較舊或特殊配置的系統可能從 UID 500 開始分配給一般使用者,但 1000 是目前最常見的起點。
為何篩選 Shell 為 /bin/bash?
登入 Shell 決定了使用者登入後與系統互動的環境。/bin/bash (Bourne Again SHell) 是 Linux 系統中最常用、功能也最豐富的預設互動式 Shell 之一。然而,並非所有帳號都需要或應該擁有互動式 Shell 存取權:
/bin/bash或/bin/sh,/bin/zsh等: 提供標準的命令列介面,允許使用者執行指令、導航檔案系統等。/sbin/nologin或/usr/sbin/nologin: 用於禁止帳號登入。當使用者嘗試用此類帳號登入時,系統會顯示一則訊息並立即結束連線。這常用於系統服務帳號。/bin/false: 與nologin類似,但也阻止登入,且通常不顯示任何訊息,直接返回失敗狀態。
篩選 Shell 為 /bin/bash 的目的是找出那些被賦予標準互動式操作權限的使用者帳號。
列出符合條件使用者的指令
結合以上理解,我們可以使用命令列工具來精確地找出目標使用者。最推薦的方法是使用 getent 搭配 awk。
推薦方法:使用 getent 和 awk
getent 命令能夠查詢系統的 Name Service Switch (NSS) 資料庫,這意味著它不僅能讀取本地的 /etc/passwd,也能查詢如 LDAP 或 NIS 等網路使用者資料庫(如果系統有配置)。awk 則是一個強大的文本處理工具,非常適合按欄位篩選和處理資料。
getent passwd | awk -F: '$3 > 1000 && $7 == "/bin/bash" { print $1 }'
指令詳解
getent passwd: 從 NSS 資料庫獲取所有使用者帳號的資訊,每行格式同/etc/passwd。|: 管道符號,將getent的輸出傳遞給下一個指令awk。awk: 呼叫 awk 處理器。-F:: 設定 awk 的欄位分隔符號為冒號:。'$3 > 1000 && $7 == "/bin/bash"': 這是 awk 的條件判斷部分。$3: 代表目前處理行的第三個欄位 (UID)。> 1000: 檢查 UID 是否大於 1000。&&: 邏輯 AND 運算子,表示兩個條件必須同時成立。$7: 代表目前處理行的第七個欄位 (Login Shell)。== "/bin/bash": 檢查 Login Shell 是否完全等於/bin/bash。
{ print $1 }: 這是 awk 的動作部分。如果條件判斷為真,則執行此動作。print $1: 印出目前處理行的第一個欄位,即使用者名稱。
預期輸出
執行上述指令後,終端機會列出所有符合條件的使用者名稱,每個名稱佔一行,例如:
alice
bob
charlie
如果想同時顯示 UID 和 Shell 以便核對,可以修改 print 部分:
getent passwd | awk -F: '$3 > 1000 && $7 == "/bin/bash" { print "User:", $1, "UID:", $3, "Shell:", $7 }'
輸出會類似:
User: alice UID: 1001 Shell: /bin/bash
User: bob UID: 1002 Shell: /bin/bash
User: charlie UID: 1005 Shell: /bin/bash
替代方法:使用 cat 和 awk
如果確定系統沒有使用網路使用者資料庫,也可以直接讀取 /etc/passwd 檔案:
cat /etc/passwd | awk -F: '$3 > 1000 && $7 == "/bin/bash" { print $1 }'
此方法功能與 getent 版本相似,但在僅依賴本地檔案時可能稍微快一點,不過通用性不如 getent。
在 Linux 終端機中執行命令列指令
視覺化比較不同使用者類型
為了更直觀地理解不同類型 Linux 使用者帳號的特性差異,以下雷達圖比較了幾種典型帳號在關鍵屬性上的表現。圖表比較了 Root 使用者、典型系統服務帳號、標準使用者(UID > 1000, 使用 /bin/bash)以及權限受限的使用者。
此圖表根據假設的評分(1-10分)展示了不同類型帳號在幾個關鍵維度上的特性:UID 範圍(數字越高表示越接近一般使用者範圍)、Shell 互動性、系統權限級別、是否擁有標準家目錄以及遠端登入的能力。
Linux 使用者帳號管理概念圖
下方的思維導圖概述了 Linux 使用者帳號管理的相關核心概念,包括帳號識別、設定檔、常用 Shell 以及管理指令,有助於理解本次查詢的背景脈絡。
(常見預設值)"] id1_3["群組 ID (GID)"] id2["設定檔 (Configuration Files)"] id2_1["/etc/passwd
(帳號基本資訊)"] id2_1_1["欄位:
Username:Password:UID:GID:GECOS:Home:Shell"] id2_2["/etc/shadow
(加密密碼與政策)"] id2_3["/etc/group
(群組資訊)"] id3["登入 Shell (Login Shells)"] id3_1["/bin/bash (常用互動式)"] id3_2["/bin/sh (基本互動式)"] id3_3["/sbin/nologin (禁止登入)"] id3_4["/bin/false (禁止登入)"] id3_5["其他 (zsh, fish, csh...)"] id4["管理指令 (Commands)"] id4_1["列出 (Listing)"] id4_1_1["getent passwd"] id4_1_2["awk"] id4_1_3["grep"] id4_1_4["cat /etc/passwd"] id4_2["新增 (Adding)"] id4_2_1["useradd"] id4_2_2["adduser (更友善的介面)"] id4_3["修改 (Modifying)"] id4_3_1["usermod"] id4_3_2["chsh (改 Shell)"] id4_3_3["passwd (改密碼)"] id4_4["刪除 (Deleting)"] id4_4_1["userdel"]
這個思維導圖從使用者識別、設定檔、登入 Shell 和管理指令四個方面,梳理了 Linux 使用者管理的核心要素。
實用範例:建立可重複使用的 Bash 腳本
如果您需要經常執行此查詢,可以將其儲存為一個簡單的 Bash 腳本,方便重複使用。
腳本內容 (例如:list_bash_users.sh)
#!/bin/bash
# Script to list normal users (UID > 1000) with /bin/bash shell
echo "Listing users with UID > 1000 and Shell=/bin/bash:"
echo "--------------------------------------------------"
getent passwd | awk -F: 'BEGIN { count=0 } $3 > 1000 && $7 == "/bin/bash" { print $1; count++ } END { print "--------------------------------------------------"; print "Total matching users found:", count }'
exit 0
如何執行
- 將上述內容儲存到一個檔案,例如
list_bash_users.sh。 - 給予腳本執行權限:
chmod +x list_bash_users.sh - 執行腳本:
./list_bash_users.sh
這個腳本不僅會列出符合條件的使用者名稱,還會在最後顯示找到的總數。
深入了解 Linux 使用者管理
管理使用者和群組是 Linux 系統管理的基本功。下面的影片提供了關於 Linux 使用者和群組管理的入門教學,涵蓋了帳號建立、群組操作等基礎知識,有助於您更全面地理解相關概念。
影片:Users and Groups Bash Tutorial (Linux/Mac/Unix)
這個教學影片解釋了如何在 Linux/Unix 系統中使用 Bash 指令來管理使用者和群組,包括列出使用者、建立新使用者和群組等操作,與我們討論的主題密切相關。
/etc/passwd 檔案欄位摘要
為了方便參考,下表總結了 /etc/passwd 檔案中每個欄位的意義:
| 欄位編號 | 欄位名稱 | 說明 | 範例 |
|---|---|---|---|
| 1 | Username | 登入系統的使用者名稱。 | alice |
| 2 | Password | 通常為 'x',表示密碼儲存在 /etc/shadow。 |
x |
| 3 | UID (User ID) | 使用者的唯一數字識別碼。 | 1001 |
| 4 | GID (Group ID) | 使用者所屬主要群組的數字識別碼。 | 1001 |
| 5 | GECOS (General Electric Comprehensive Operating Supervisor) | 使用者相關資訊,如全名、辦公室電話等,以逗號分隔。 | Alice Wonderland,,, |
| 6 | Home Directory | 使用者登入後的預設目錄路徑。 | /home/alice |
| 7 | Login Shell | 使用者登入後執行的預設 Shell 程式路徑。 | /bin/bash |
理解這些欄位對於解析 /etc/passwd 檔案和使用 awk 等工具進行篩選至關重要。
常見問題 (FAQ)
如果我的系統上一般使用者是從 UID 500 開始,該如何修改指令?
只需將指令中的 $3 > 1000 條件改為 $3 >= 500 (如果包含 UID 500) 或 $3 > 499。例如:
getent passwd | awk -F: '$3 >= 500 && $7 == "/bin/bash" { print $1 }'
請根據您系統的實際 UID_MIN 設定值調整條件。您可以在 /etc/login.defs 檔案中查找 UID_MIN 的設定值。
如何列出所有 UID 大於 1000 且擁有 *任何* 有效登入 Shell 的使用者?
您可以修改條件,排除那些明確禁止登入的 Shell,例如 /sbin/nologin 和 /bin/false。一個常用的方法是檢查 Shell 路徑是否包含 "nologin" 或 "false":
getent passwd | awk -F: '$3 > 1000 && $7 !~ /nologin/ && $7 !~ /false/ { print $1, $7 }'
這裡 !~ 表示「不匹配」後面的正則表達式。這個指令會列出 UID 大於 1000,且 Shell 路徑中不包含 "nologin" 或 "false" 的使用者及其 Shell。
如何列出 UID 大於 1000 但登入 Shell *不是* /bin/bash 的使用者?
將條件中的 == (等於) 改為 != (不等於) 即可:
getent passwd | awk -F: '$3 > 1000 && $7 != "/bin/bash" { print $1, $7 }'
這會列出所有 UID 大於 1000,但使用 /bin/bash 以外 Shell 的使用者名稱及其 Shell。
/sbin/nologin 和 /bin/false 作為 Shell 有什麼作用?
這兩者都用於建立不能進行互動式登入的帳號,通常分配給系統服務或應用程式帳號,以提高安全性。
/sbin/nologin(或/usr/sbin/nologin): 當使用者嘗試使用設定了此 Shell 的帳號登入時,系統通常會顯示一條友善的提示訊息(例如 "This account is currently not available."),然後終止登入程序。/bin/false: 這個 Shell 更為直接,它只是一個返回失敗狀態碼 (非 0) 的程式。當使用者嘗試登入時,系統執行/bin/false,它立即結束並返回失敗,通常不會顯示任何訊息,直接導致登入失敗。
兩者效果都是阻止登入,但 nologin 提供了更明確的回饋。
推薦探索
- 如何在Linux中列出所有使用者帳號?
- 解釋Linux中的UID和GID是什麼以及它們的作用。
- 如何更改Linux使用者的預設登入Shell?
- 比較不同的Linux Shell,例如 bash、sh 和 zsh。
參考資料
Last updated April 30, 2025