домашние каталоги unix без записей в /etc/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)

Может быть, сразу вывести первую команду в файл, затем прочитать каждую строку в команде поиска и... или проверить с помощью

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

Как теперь все это собрать...

РЕДАКТИРОВАТЬ: у isedev было именно то, что мне было нужно. Возможно, я неправильно сформулировал исходное сообщение... мы очищали пользователей, но не очищали их домашний каталог. Поэтому я хочу знать, какие каталоги /home все еще существуют, в которых нет записей /etc/passwd.

это то, что работало на Т

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


person mohuddle    schedule 07.10.2014    source источник
comment
Не совсем надежный. учетные записи ВООБЩЕ имеют свой домашний каталог в /home, но не все из них. например рассмотрим учетную запись root, которая обычно живет в /root   -  person Marc B    schedule 07.10.2014
comment
@MarcB Если OP не хочет знать, есть ли каталоги в /home, которые не соответствуют записям в /etc/passwd.   -  person isedev    schedule 07.10.2014
comment
Вас беспокоят каталоги в /home, на которые претендует более одной записи в /etc/passwd?   -  person Jonathan Leffler    schedule 07.10.2014


Ответы (3)


Итак, предположим, что вы хотите знать, есть ли каталоги в /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$"
person isedev    schedule 07.10.2014
comment
+1. В качестве примечания вы также можете упростить до for name in /home/*; do [ -d "$name" ] && cut -d':' -f6 /etc/passwd | grep q "^$name$" || echo "directory $name does not correspond to a valid user"; done. Я бы также использовал простой grep, здесь нет необходимости в egrep, и, в любом случае, он устарел (по крайней мере, для GNU grep) в пользу grep -E уже несколько лет. - person terdon; 08.10.2014
comment
@terdon все хорошие моменты (ну, кроме «устаревшей» части - я чувствую себя старым). - person isedev; 08.10.2014
comment
Расскажи мне об этом :). У меня появилась привычка использовать grep -E, поскольку это предлагается на странице руководства. - person terdon; 08.10.2014
comment
POSIX 2008 стандартизирует grep и параметр -E; больше нет отдельного egrep (или fgrep). - person Jonathan Leffler; 08.10.2014
comment
@JonathanLeffler они все еще присутствуют во многих (всех?) Linux-системах для обратной совместимости. - person terdon; 08.10.2014
comment
И gets() все еще находится в библиотеке C для обратной совместимости... вещи удаляются из стандартов задолго до того, как они удаляются с машин. - person Jonathan Leffler; 08.10.2014
comment
запуск 1000 раз cut и egrep не лучшее решение для длинных файлов passwd. - person novacik; 08.10.2014

Это сообщит обо всех домашних каталогах из /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
person terdon    schedule 07.10.2014

как 1-е приближение:

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 ... (без аргументов, как указано выше) покажет 3 столбца 1.) только в /home 2.)только в /etc/passwd 3.) общий
  • comm -23 .... - покажет каталоги, которые есть только в /home (а не в /etc/passwd)
  • comm -13 .... - покажет каталоги, которые находятся только в /etc/passwd, а не в /home
  • comm -12 .... - покажет правильные каталоги (существует в /etc/passwd и /home тоже)

Я не уверен с -{max|min}depth на AIX..

person jm666    schedule 07.10.2014
comment
Это в AIX...perl с параметром -E, работающим в AIX 7.1, но не в 6.1. - person mohuddle; 07.10.2014
comment
@ user2341048 теперь perl должен работать (с -lane) - person jm666; 07.10.2014