Chat
Ask me anything
Ithy Logo

精確找出 Linux 系統中的特定使用者帳號

如何列出登入 Shell 為 /bin/bash 且 UID 大於 1000 的 Linux 使用者?

list-linux-users-bash-uid-1000-zu7epld7

在 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

  1. 使用者名稱 (Username): 登入系統時使用的名稱。
  2. 密碼佔位符 (Password Placeholder): 通常顯示為 'x',表示加密後的密碼儲存在更安全的 /etc/shadow 檔案中。
  3. 使用者 ID (UID): 系統內部用來識別使用者的唯一數字 ID。這是我們篩選條件之一。
  4. 群組 ID (GID): 使用者所屬主要群組的數字 ID。
  5. 使用者資訊 (GECOS): 可選欄位,通常包含使用者全名或其他描述性資訊。
  6. 家目錄 (Home Directory): 使用者登入後預設的工作目錄路徑。
  7. 登入 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

推薦方法:使用 getentawk

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

替代方法:使用 catawk

如果確定系統沒有使用網路使用者資料庫,也可以直接讀取 /etc/passwd 檔案:

cat /etc/passwd | awk -F: '$3 > 1000 && $7 == "/bin/bash" { print $1 }'

此方法功能與 getent 版本相似,但在僅依賴本地檔案時可能稍微快一點,不過通用性不如 getent

Linux Terminal Example

在 Linux 終端機中執行命令列指令


視覺化比較不同使用者類型

為了更直觀地理解不同類型 Linux 使用者帳號的特性差異,以下雷達圖比較了幾種典型帳號在關鍵屬性上的表現。圖表比較了 Root 使用者、典型系統服務帳號、標準使用者(UID > 1000, 使用 /bin/bash)以及權限受限的使用者。

此圖表根據假設的評分(1-10分)展示了不同類型帳號在幾個關鍵維度上的特性:UID 範圍(數字越高表示越接近一般使用者範圍)、Shell 互動性、系統權限級別、是否擁有標準家目錄以及遠端登入的能力。


Linux 使用者帳號管理概念圖

下方的思維導圖概述了 Linux 使用者帳號管理的相關核心概念,包括帳號識別、設定檔、常用 Shell 以及管理指令,有助於理解本次查詢的背景脈絡。

mindmap root["Linux 使用者帳號管理"] id1["識別 (Identification)"] id1_1["使用者名稱 (Username)"] id1_2["使用者 ID (UID)"] id1_2_1["0: root (超級使用者)"] id1_2_2["1-999: 系統帳號 (System Accounts)"] id1_2_3[">=1000: 一般使用者 (Normal Users)
(常見預設值)"] 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

如何執行

  1. 將上述內容儲存到一個檔案,例如 list_bash_users.sh
  2. 給予腳本執行權限:chmod +x list_bash_users.sh
  3. 執行腳本:./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 開始,該如何修改指令?

如何列出所有 UID 大於 1000 且擁有 *任何* 有效登入 Shell 的使用者?

如何列出 UID 大於 1000 但登入 Shell *不是* /bin/bash 的使用者?

/sbin/nologin/bin/false 作為 Shell 有什麼作用?


推薦探索

參考資料


Last updated April 30, 2025
Ask Ithy AI
Download Article
Delete Article