回顯具有特定 gid 的用戶

回顯具有特定 gid 的用戶

我應該編寫一個 shell 腳本,該腳本將回顯主要群組等於 id 為命令列參數的群組的使用者的使用者名稱。

答案1

因為您是按 GID 而不是按群組進行查找姓名,而你只對基本的每個用戶的 GID,這對 Awk 來說非常簡單。

的格式/etc/passwd在 中描述man 5 passwd。引用手冊頁:

   There is one entry per line, and each line has the format:

          account:password:UID:GID:GECOS:directory:shell

所以你想列印每行的第一個字段第四字段是傳遞給腳本的內容。其中「字段」由冒號分隔。

就我個人而言,我不會為此操心腳本;我會使用 shell 函數。看:

所以你需要的是:

  • -F對 Awk 選項的理解
  • 對 awk 語法的基本了解是condition {action}
  • 了解如何在使用 Awk 時引用字段,以及
  • 如果您了解如何將 shell 變數傳遞給 Awk,將會有所幫助;查看-vawk 的選項。

檢查 Awk 的手冊頁以獲得這些要點。


我不會為你做作業——重點是要學會程式碼,不學複製貼上。但如果您對此感到困惑,請對此問題發表評論。如果需要,我可以添加更多細節。 (大約一周後我可以更新以包含完整的解決方案。)


附註:在現實世界中,正如您從其他答案中看到的那樣,與尋找用戶相關的複雜性要大得多。用戶的儲存方式有很多不同,考慮到這些複雜性可能會......很複雜。

但您的問題似乎是一項量身定制的作業,可以使用 Awk 輕鬆完成,同時也是一個在現實世界中有用的實際應用程式。

答案2

這並不總是可能的,因為用戶資料庫並不總是可枚舉的。

passwd資料庫(/etc/passwdLDAP、mysql、NIS+等或組合)中,主鍵是使用者名稱。 (多個使用者可以具有相同的 uid,也可能具有不同的 gid)。

您始終可以在使用者資料庫中查詢給定的使用者名稱,但無法始終檢索完整的使用者清單。

你可以試試。沒有標準的命令,但許多系統都有一個getent您可以使用的命令。

getent passwd

將以 csv(冒號分隔)形式傳回使用者清單。第一個欄位是用戶名,第四個欄位是主 gid。因此,如果您知道 gid,則可以使用 輕鬆返回使用者清單awk

getent -- group "$group"

將查詢給定的群組資料庫$group,並傳回一行 csv,其中第三個欄位是 gid。cut就足以提取它。

如果用戶資料庫不可枚舉,您可能需要嘗試單獨查詢每個可能的 uid 編號(注意某些系統支援最大 2 31 的uid ),但即使這樣也不能保證返回所有可能的用戶,因為可能有多個用戶每個uid 都有一個用戶,密碼資料庫查詢通常只會回傳一個用戶。

答案3

#!/bin/sh

if [ $# -ne 1 ]
then
  echo "Usage: $0 gid"
  exit 1
fi

getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'

對參數是否存在進行錯誤檢查後,腳本getent passwd使用 awk 查詢使用者資料庫 ( ),以根據群組資料庫中的主群組 ID 檢查第四個欄位(主群組 ID)。如果一行(使用者條目)匹配,它將列印第一個欄位(使用者名稱)。

相關內容