背景:未分类的RHEL 6安全技术实施指南(STIG)是一份国防部指南,在(STID-ID)RHEL-06-000294中规定出现在/ etc / passwd中的所有用户主要GID必须存在于/ etc /中基。
不是运行推荐的'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.
这看起来应该很简单,但我显然错过了一些东西。
感谢您的帮助。
-Kirk
答案 0 :(得分:2)
列出/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
答案 1 :(得分:0)
我正在思考这些问题:
if ! grep "^$(groups $USERNAME | cut -d\ -f 1):" /etc/group > /dev/null; then
usermod -g users $USERNAME
fi
其中
groups $USERNAME | cut -d\ -f 1
通过在第一个空格($USERNAME
之前)和
groups $USERNAME
的输出来给出:
的主要组
grep ^foo: /etc/group
检查组foo是否存在。
编辑:修复代码:在空格处引用和拆分而不是冒号以允许grep模式中的附加冒号(否则,grep ^foo
也会说组foo
存在小组foobar
)。