Unix
列出所有指定 unix 組中的使用者
有沒有一種簡單的方法來獲取所有指定組中的使用者列表?
例如,如果我有以下使用者:
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" }' }