我需要为大学做一个剧本,但由于我必须做繁重的工作,我没有时间了解如何制作,我甚至没有圣诞节假期:(。所以我来这里寻求帮助。
我需要制作一个脚本,为/etc/passwd中的每个条目(用户(检查用户是否为密码,他的homedir是否存在,以及他的组是否有效(存在(如果它没有遵循一个条件,我应该把它写在/tmp/auth_errors中。在失败的情况下我应该写什么,没有具体的说明,所以一件简单的事情就足够了。
我一直在四处寻找,我看到了许多检查是否有没有密码的用户的例子,但通常这些例子都是单行的,我需要再次检查每个用户的组和homedir条件,我不知道如何做到这一点。
我在编程方面很有经验,但这种bash脚本让我混淆了数组、grep等。
如果你能帮我,我会很高兴的,这样我就可以休息一下了,否则我恐怕不会。
谢谢大家。
编辑:一些可爱的灵魂帮助了我。但他没有包括验证用户是否有密码的部分,所以我四处搜索,想出了这个。同时我无法测试它,需要等待老师修复VM
while IFS=: read -r user pass uid gid info home shell
do
if[[ $(passwd -status "$uid" | awk '{print $2}') = NP ]] **HERE
then
echo "$uid dosent have a password."
fi
[ -d "$home" ] || echo "$user is missing home dir $home"
getent group "$gid" > /dev/null || echo "$user has invalid group id $gid"
done < /etc/passwd >> /tmp/auth_errors
你认为这行得通吗?主要是";如果[[$(passwd…."直到"fi"?
如何制作一个for循环,每个循环都会考虑passwd中的一个userID(需要丢弃到passwd的其他列(,这样我就可以使用该userID来验证我需要的东西(。
/etc/passwd
是一个简单的文件,其字段由:
分隔。一个简单的while read
循环就足够了:
# see man 5 passwd, I might mixed smth
while IFS=: read -r name pass uid gid comment home interpreter; do
# do something with uid
echo "Hello to $name with uid=$uid!"
done < /etc/passwd
有关更多示例,请参阅bashfaq如何逐字段读取文件,并参阅man 5 passwd。