如何在 Linux 上列出組中的所有用戶

已發表: 2022-08-29
顯示 bash 提示符的 Linux 筆記本電腦
fatmawati achmad zaenuri/Shutterstock.com

在 Linux 上,文件具有三組權限。 一組用於文件組。 在將文件分配給組之前,您可能需要檢查組成員是誰。

文件和目錄權限

Linux 上的文件和目錄對所有者有一組權限,對文件分配到的組有另一組權限,對不屬於前兩個類別之一的每個人都有權限。

每組權限定義該類別的成員是否可以讀取、寫入或執行文件。 在目錄的情況下,執行操作等同於能夠cd進入目錄。

文件或目錄的默認組是所有者的默認組。 這通常是創建它的人。 組權限用於允許一組用戶對該組的其他成員的文件和目錄具有受控訪問權限。

例如,您可能有一個開發團隊、一個文檔團隊、一個研究團隊等等。 可以將每個團隊的成員添加到適當命名的組中,以幫助協作。 用戶可以同時在多個組中。

這是一個簡單但穩健的方案。 但是,如果您的文件很敏感,那麼在與他們分享您的工作之前,您可能會更樂意檢查該組的成員是誰。 有不同的方法可以做到這一點。 但請注意。 兩種最常推薦的方法是有問題的。

相關:如何在 Linux 上使用 chgrp 命令

/etc/groups 文件

“/etc/group”文件包含以冒號“ : ”分隔的組和組成員列表。 每行有四個字段。

  • Name :組的唯一名稱。
  • 密碼:未使用。 這將始終保持“x”。
  • 組 ID :唯一的組標識符。
  • 用戶:組成員的逗號分隔列表。 對於系統和守護程序帳戶,該列表通常為空。

要將文件的內容轉儲到終端窗口,可以使用cat ,但使用less滾動文件內容更方便。

 少 /etc/group 

使用 cat 查看 /etc/group 文件的內容

列表頂部的大多數條目都沒有成員,儘管“adm”組有兩個,“cdrom”組有一個。

less 文件查看器中 /etc/groups 文件的第一部分

如果我們想發現特定用戶所在的組,我們可以使用grep來搜索帶有用戶帳戶名的條目。 這不是我們手頭的任務。 我們希望看到屬於某個組的每個人,而不是一個人所屬的組。 但對我們來說看看是有啟發性的。

 grep “戴夫” /etc/group 

用戶 dave 所屬的組列表

為我們列出了包含字符串“dave”的條目。 隱藏在其中的跡象表明,事情可能並不像我們想像的那麼簡單。

將用戶添加到 Linux 時,默認操作是將他們放在與其用戶帳戶同名的組中。 這是他們的主要群體。 將它們添加到的任何其他組稱為輔助組。

問題是用戶沒有被列為其主要組的成員。 這就是組“dave”沒有顯示任何成員的原因,儘管用戶“dave”是該組的成員。

當然,系統管理員可以將任何用戶的主組更改為任何其他組的主組。 這意味著用戶可以是任何組的成員,但不會在“/etc/group”文件中這樣列出。 這是一個問題。

第二個問題是“/etc/group”文件不是單一的事實來源。 現代 Linux 安裝可能會將用戶和組信息存儲在比“/etc/passwd”和“/etc/group”更多的位置,尤其是在部署了輕量級目錄訪問協議等服務的公司情況下。 只看一個地方,你可能看不到全局。

在我們的測試場景中,我們為一個開發部門創建了四個組。 他們是:

  • resteam :研究團隊。
  • devteam :開發團隊。
  • pvqteam :產品驗證和質量團隊。
  • docteam :文檔團隊。

我們為這些團隊增加了人員。 有些人在不止一個團隊中。 如果我們在less中打開“/etc/group”文件並滾動到文件底部,我們將看到新的組和組成員。 至少,與“/etc/group”文件所知道的成員一樣多。

less 文件查看器中 /etc/group 文件的底部

如果我們想提取單個組,我們可以使用grep進行搜索。 插入符號“ ^ ”代表一行的開始。

 grep "^devteam" /etc/group 

使用 grep 提取單個組的成員

這將從文件中提取“devteam”條目並列出所有組成員。 或者是嗎?

getent 命令

getent命令檢查多個數據庫的用戶組信息,而不僅僅是“/etc/group”。 我們將使用getent向我們展示用戶組。

使用 getent 列出所有已定義的組

使用getentgroup選項——在這台測試機器上——產生與使用“/etc/group”文件相同的結果。 那是因為我們沒有使用 LDAP 或任何其他集中式命名服務。 因此,沒有其他來源可供getent參考。

getent 組的輸出顯示組和成員

因此,結果與“/etc/group”文件中的結果一致也就不足為奇了。 也許我們真正看到的是現實情況。 也許一切都很簡單——在這台電腦上——所見即所得? 讓我們對此保留判斷。

getent命令可以為我們查看單個組。 我們將看看“devteam”組。

 getent group devteam 

使用 getent group 提取單個組的詳細信息

我們得到與以前完全相同的結果。 不過有一種方法可以深入挖掘。

相關:如何在 Linux 中列出用戶

蓋子命令

lid命令是libuser工具集的一部分。 它已經安裝在我們的 Fedora 36 測試計算機上,但必須安裝在 Ubuntu 22.04 和 Manjaro 21 上。

此外,該命令在 Fedora 和 Manjaro 上稱為lid ,但在 Ubuntu 上,您需要使用libuser-lid

要在 Ubuntu 上安裝命令,請鍵入:

 sudo apt install libuser 

在 Ubuntu 上安裝 libuser

在 Manjaro 上, libuser是從 AUR 安裝的,因此您需要使用您最喜歡的 AUR 助手。 我們用yay

 耶 libuser 

在 Manjaro 上安裝 libuser

您可以使用libuser-lid顯示有關組或用戶的組信息。 要顯示個人所在的組,請在命令行中傳遞他們的用戶帳戶名。 在 Fedora 和 Manjaro 上,請記住使用lid而不是libuser-lid

 sudo libuser-lib 戴夫

使用 libuser-lid 顯示用戶 dave 所屬的組

要查看組的成員,請使用-g (組)選項以及組的名稱。

 sudo libuser-lid -g devteam 

使用 libuser-lid 列出 devteam 組的成員

瞧,一個名為“francis”的用戶出現在列表中。 這是我們第一次見到他。 他沒有在“/etc/group”中列出, getent也沒有發現他。

讓我們看一些使用groups命令的用戶。

 團體阿比蓋爾
團體海登
弗朗西斯集團

對選擇的用戶使用組命令

  • 用戶“abigail”在一個名為“abigail”的組和另外兩個組“resteam”和“devteam”中。
  • 用戶“hayden”在一個名為“hayden”的組和另外兩個組“pvqteam”和“docteam”中。
  • 用戶“francis”在一個組中,即“devteam”組。 值得注意的是,他們不在一個名為“francis”的組中。
在 Linux 上將用戶添加到組(或第二組)
相關在 Linux 上將用戶添加到組(或第二組)

我們知道每個用戶都必須是主要組的成員,並且默認情況下,主要組具有與用戶的 UID 和帳戶名稱匹配的 GID 和名稱。 用戶“francis”似乎有些不同。

讓我們使用id命令,看看 UID 和 GID 告訴我們什麼。

 艾比蓋爾
弗朗西斯

在用戶 abigail 和 francis 上使用 id 命令

用戶“abigail”的 UID 為 1002,GID 為 1002。它們分為三組,其中一組稱為“abigail”。 它的 GID 為 1002。這是他們的默認主要組。

用戶“francis”的 GID 為 1019,與“devteam”組的 GID 匹配。 此用戶已被分配一個新的主要組,或者當此用戶添加到系統時,“devteam”組被設置為他們的主要組。

無論是哪一個,只有libuser-lid檢測到它們並報告它們在“devteam”組中的存在。

魔鬼在細節中

所以看到真實的細節很重要。

小組是建立協作的好方法,只要您知道要與誰開放即可。

相關:如何在 Linux 上使用 chfn 和 usermod 更改用戶數據