![](/img/trans.png)
[英]How to find list of groups that are present in '/etc/passwd' but not in the '/etc/group'?
[英]How to ensure that gid in /etc/passwd also exist in /etc/group
背景:DoD指南《未分類的RHEL 6安全技術實施指南》(STIG)在RHEL-06-000294(STID-ID)中指定,出現在/ etc / passwd中的所有用戶主要GID必須存在於/ etc / group中。
與其運行推薦的“ pwck -rq”命令並傳遞到日志,然后強制管理員手動進行補救,不如通過編程方式檢查用戶GID是否存在,如果不存在,只需將其設置為確實存在的某種方式,則更有意義。作為“用戶”或“沒人”
我一直在反對這個想法,但還不能完全理解。 我在sed,awk以及將grep放入sed或awk中失敗了。 問題似乎出在我嘗試嵌套命令時。 我了解到awk不會嵌套在單線中(或可能根本不會嵌套)的困難方式。
更傳統的循環的偽代碼如下所示:
# do while not EOF /etc/passwd
# GIDREF = get 4th entry, sepparator ":" from line
# USERNAMEFOUND = get first entry, separator ":" from line
# grep ":$GIDREF:" /etc/group
# if not found then
# set GID for USERNAMEFOUND to "users"
# fi
# end-do.
這似乎應該很簡單,但我顯然遺漏了一些東西。
謝謝您的幫助。
-柯克
列出/etc/passwd
中/etc/group
不存在的所有GID:
comm -23 <(awk -F: '{print $4}' /etc/passwd | sort -u) \
<(awk -F: '{print $3}' /etc/group | sort -u)
解決它們:
nogroup=$(awk -F: '($1=="nobody") {print $3}' /etc/group)
for gid in $(
comm -23 <(awk -F: '{print $4}' /etc/passwd | sort -u) \
<(awk -F: '{print $3}' /etc/group | sort -u)); do
awk -v gid="$gid" -F: '($4==gid) {print $1}' /etc/passwd |
xargs -n 1 usermod -g "$nogroup"
done
我在考慮以下方面:
if ! grep "^$(groups $USERNAME | cut -d\ -f 1):" /etc/group > /dev/null; then
usermod -g users $USERNAME
fi
哪里
groups $USERNAME | cut -d\ -f 1
通過在第一個空格處分割groups $USERNAME
的輸出(在:
之前)來給出$USERNAME
的主要組
grep ^foo: /etc/group
檢查組foo是否存在。
編輯:修復代碼:引用和在空格處而不是在冒號處分割,以允許在grep模式中附加冒號(否則, grep ^foo
也將說如果存在group foobar
則存在group foo
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.