在 Linux 系統管理中,經常需要根據特定條件篩選使用者帳號。您的查詢要求列出所有預設登入 Shell 設定為 /bin/bash
且使用者 ID (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
/etc/shadow
檔案中。/bin/bash
)。使用者 ID (UID) 是 Linux 系統區分不同帳號的關鍵。按照 Linux 標準基底 (LSB) 和多數發行版(如 Ubuntu, Debian, RHEL 7+)的慣例,UID 的分配有特定範圍:
因此,篩選 UID > 1000
的目的是排除系統帳號和 root,專注於找出系統上的一般使用者。請注意,有些較舊或特殊配置的系統可能從 UID 500 開始分配給一般使用者,但 1000 是目前最常見的起點。
/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 使用者帳號管理的相關核心概念,包括帳號識別、設定檔、常用 Shell 以及管理指令,有助於理解本次查詢的背景脈絡。
這個思維導圖從使用者識別、設定檔、登入 Shell 和管理指令四個方面,梳理了 Linux 使用者管理的核心要素。
如果您需要經常執行此查詢,可以將其儲存為一個簡單的 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 使用者和群組管理的入門教學,涵蓋了帳號建立、群組操作等基礎知識,有助於您更全面地理解相關概念。
影片: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
等工具進行篩選至關重要。
/bin/bash
的使用者?/sbin/nologin
和 /bin/false
作為 Shell 有什麼作用?