Unix

列出所有指定 unix 組中的使用者

  • February 23, 2011

有沒有一種簡單的方法來獲取所有指定組中的使用者列表?

例如,如果我有以下使用者:

fred - rainbow, dell
jane - hp
zippy - rainbow, hp, dell
george - hp, dell
bungle - rainbow, hp, dell

我想要這樣的東西:

[me@box ~]$ magic "dell,hp"
zippy, george, bungle

即返回同時在戴爾和惠普的使用者。

如果它是多個步驟,那很好,但如果不必求助於大量 Bash 黑魔法就不可能,而且在啟用 RE 的文本編輯器中執行它更快,也很好。

如果這有什麼不同,我會在 RHEL4 上執行。

我不知道有任何工具可以做到這一點,但它很容易編寫腳本。

首先獲取系統上的使用者列表,然後groups在每個使用者上執行,最後grep在所需的組上執行:

getent passwd | sed 's/:.*$//g' | \
   while read user; do groups $user; done | \
   grep group1 | grep group2

這一次適用於兩組:

getent group dell hp | cut -d: -f 4 | tr , '\n' | sort | uniq -d | sed ':a;$s/\n/, /g;N;ba'

把它放在一個經過一些修改的函式中,它將處理任意數量的組:

grmagic () {
   getent group "$@" | 
       cut -d: -f 4 | 
       tr , '\n' | 
       sort | 
       uniq -dc | 
       grep "^[[:blank:]]*$#" |
       awk '{all = all d $3; d = ", "} END {print all}'
}

執行:

$ grmagic dell hp
zippy, george, bungle
$ grmagic dell hp rainbow
zippy, bungle

一個主要由 AWK 腳本組成的函式:

grmagic () {
   getent group "$@" |
   awk -F: -v "c=$#" '{
           split($4, a, ","); 
           for (i in a) n[a[i]]++
       } 
       END { 
           for (i in n) 
           if (n[i] == c) {
               printf d i; d=", "
           }; 
           printf "\n"  }'
}

引用自:https://serverfault.com/questions/239083