mohuddle
mohuddle

Reputation: 23

unix home directories without entries in /etc/passwd

I am able to get both listings ( /etc/passwd and /home ) but how to script something like read line of /etc/passwd, parse home directory, then look for that in /home . If it doesn't exist, throw an error, if it does exist, move along.

/etc/passwd home dir listing for users

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

user listing from /home

ls -1 /home | (while read line; do echo "/home/"$line; done)

Maybe right out output from first command to a file, then read each line into a find command and...or, test with

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

Now how to put it all together...

EDIT: isedev had exactly what I needed. I may have mis-worded my original message...we have been cleaning up users, but not cleaning up their /home directory. So I want to know what /home directories still exist that don't have /etc/passwd entries.

this is what worked to a 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

from now on, we will be running

userdel -r login

Upvotes: 2

Views: 1746

Answers (3)

clt60
clt60

Reputation: 63892

as 1st approximation:

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

if you want find the differences between the /etc/passwd and the /home

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

in an narrow form

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

if you will use

  • comm ... (without args as above) will show 3 colums 1.) only in /home 2.)only in /etc/passwd 3.) common
  • comm -23 .... - will show directories what are only in the /home (and not in the /etc/passwd)
  • comm -13 .... - will show dirs what are only in the /etc/passwd and not in the /home
  • comm -12 .... - will show correct directories (exists in the /etc/passwd and the /home too)

I'm not sure with the -{max|min}depth on the AIX..

Upvotes: 2

terdon
terdon

Reputation: 3370

This will report all home directories from /etc/passwd that should be in /home but aren't:

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

And this one reports all that don't exist:

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

Upvotes: 2

isedev
isedev

Reputation: 19601

So, assuming you want to know if there are directories under /home which do not correspond to existing users:

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

Then again, this assumes you are not using a name service such as LDAP or NIS, in which case, change the line starting with cut to:

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

Upvotes: 1

Related Questions