在/ etc / passwd中没有条目的unix主目录

时间:2014-10-07 19:36:45

标签: shell unix directory passwd

我能够获得两个列表(/ etc / passwd和/ home),但是如何编写/ etc / passwd的读取行,解析主目录,然后在/ home中查找。如果它不存在,则抛出一个错误,如果确实存在,则移动。

用户

/ etc / passwd主目录列表

cut -d":" -f6 /etc/passwd | grep home | sort

/ home

中的用户列表
ls -1 /home | (while read line; do echo "/home/"$line; done)

也许将第一个命令输出到文件,然后将每一行读入一个find命令并......或者用

进行测试
if [ -d "$DIRECTORY" ]; then
echo "directory found for user that doesn't exist"
fi

现在如何把它们放在一起......

编辑:isedev正是我所需要的。我可能错误地记录了我原来的消息......我们一直在清理用户,但没有清理他们/ home目录。所以我想知道仍然存在没有/ etc / passwd条目的/ home目录。

这对T

有用

for name in /home/*; do if [ -d "$name" ]; then cut -d':' -f6 /etc/passwd | egrep -q "^$name$" if [ $? -ne 0 ]; then echo "directory $name does not correspond to a valid user" fi fi done

从现在开始,我们将运行

userdel -r login

3 个答案:

答案 0 :(得分:2)

作为第一近似值:

perl -F: -lane 'next if m/^#/;print "$F[5] for user $F[0] missing\n" unless(-d $F[5])' /etc/passwd

如果您想查找/etc/passwd/home

之间的差异
comm <(find /home -type d -maxdepth 1 -mindepth 1 -print|sort) <(grep -v '^#' /etc/passwd  | cut -d: -f6| grep '/home' | sort)

以狭义的形式

comm    <(
            find /home -type d -maxdepth 1 -mindepth 1 -print |sort
        ) <(
            grep -v '^#' /etc/passwd  |cut -d: -f6 |grep /home |sort
        )

如果您将使用

  • comm ...(如上所述没有args)将显示3个列1.)仅在/ home 2.)仅在/ etc / passwd中3.)common
  • comm -23 .... - 将显示仅在/ home中的目录(而不在/etc/passwd中)
  • comm -13 .... - 将显示目录中只有/ etc / passwd而不是/home
  • comm -12 .... - 将显示正确的目录(存在于/etc/passwd/home中)

我不确定AIX上的-{max|min}depth ..

答案 1 :(得分:2)

这将报告来自/etc/passwd/home但不是cut -d":" -f6 /etc/passwd | grep home | sort | while read dir; do [ -e "$dir" ] || echo Missing $dir; done 的所有主目录:

cut -d":" -f6 /etc/passwd | while read dir; do 
    [ -e "$dir" ] || echo Missing $dir
done

这个报告所有不存在的内容:

{{1}}

答案 2 :(得分:1)

因此,假设您想知道/ home下是否存在与现有用户不对应的目录:

for name in /home/*; do
    if [ -d "$name" ]; then
        cut -d':' -f6 /etc/passwd | egrep -q "^$name$"
        if [ $? -ne 0 ]; then
            echo "directory $name does not correspond to a valid user"
        fi
    fi
done

然后再次假设您没有使用LDAP或NIS等名称服务,在这种情况下,请将以cut开头的行更改为:

getent passwd | cut -d':' -f6 | egrep -q "^$name$"