bash - 查找意外的用户帐户

时间:2011-09-08 13:03:09

标签: bash

我有一个很好的行列出所有用户帐户,但我如何判断其中一个是否不在列表中。

cat /etc/passwd | grep "/home" | cut -d: -f1

fred 
barney
wilma
elroy_jetson

我不认为Elroy Jetson会在Bedrock,所以我想举起一面旗帜。 我能想到的唯一方法就是笨拙:

ALL_USERS_ARE_VALID="true"
for USER in `cat /etc/passwd | grep "/home" | cut -d: -f1`; do
  if [[ "$USER" == "fred" ]]; then
    #valid user
  elif [[ "$USER" == "barney" ]]; then
    #valid user
  elif [[ "$USER" == "wilma" ]]; then
    #valid user
  else
    ALL_USERS_ARE_VALID="false"
  fi
done

必须有更好的方法......

5 个答案:

答案 0 :(得分:2)

:> cat expectedResidents
fred 
barney
wilma
:> cat /etc/passwd | grep "/home" | cut -d: -f1| fgrep -vf expectedResidents
elroy_jetson

fgrep表示* file * grep,其中file包含您要搜索的目标。请注意,传统的fgrep仅支持精确的字符串匹配(以及-i ignore-case)选项,因此搜索列表文件中的尾随空格等将导致问题。像往常一样使用-v选项意味着忽略与指定模式匹配的行。 -f告诉fgrep要使用哪个文件。最后,对于传统的fgrep(Sun等),搜索列表文件中有多少行可以限制,因此如果这是针对大型生产系统,则测试,测试,测试; - )

根据您的操作系统,您可能需要确定是否需要使用grep -F -vf ...或类似内容。

我希望这会有所帮助。

答案 1 :(得分:1)

你怎么能指望电脑知道elroy不应该在基岩?如果你有一个“已知”有效帐户列表,请提供一个文件,然后grep -v说明找不到这些帐号。

答案 2 :(得分:1)

编写链式if语句的更好方法是使用case结构,如下所示:

case "$USER" in
  fred|barney|wilma)
    # valid user
    ;;
  *)
    ALL_USERS_ARE_VALID="false"
esac

答案 3 :(得分:1)

不是使用多个if语句,而是将有效用户存储在文件中,然后使用comm进行比较。

示例:

$ cat valid_users # file containing valid users
fred 
barney
wilma

$ comm -23 <(cat /etc/passwd | grep "/home" | cut -d: -f1 | sort) <(sort valid_users)
elroy_jetson

答案 4 :(得分:1)

您可以使用case in声明。

例如:

case `cat /etc/passwd | grep "/home" | cut -d: -f1` in
        fred | barney | wilma )
                # valid
        ;;
        *)
                echo "Unallowed user";
                break;
        ;;
esac;