打印出没有/home目录的用户和没有用户的/home目录

打印出没有/home目录的用户和没有用户的/home目录

我需要开发一个 perl 脚本,它将生成任何没有home目录的用户以及任何home未附加到用户的目录的格式化列表。例如,如果我使用下面的脚本读取系统用户,我将如何打印出哪些用户没有基于他们的主目录UID

open (USERS, '-|' , 'getent passwd' ) or die $!;
    @passwd_entries = <USERS>;
    close USERS;

如果我使用下面的脚本读取系统的主目录,我将如何打印出哪些目录没有附加用户?

open (HOMES, '-|' , 'ls /home' ) or die $!;
    @home_dirs = <HOMES>;
    close HOMES;

答案1

如果您对解决方案感到满意bash,这将写出 中没有主目录的用户列表/home,并且该目录下的目录/home在密码数据库中没有用户:

comm -3 <(getent passwd | cut -d: -f6 | sort -u) <(ls -d1 /home/*)

答案2

自从我使用 Perl 以来已经有一段时间了,但我想出了一些可以帮助您到达您需要去的地方的东西。由于您使用的是 Perl,我们将避免使用任何bash命令:

#!/usr/bin/perl
use strict;
use warnings;

# this will get all users and homedirs directly
while(my ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwent()){
    my $dirstate;
    # this will check if $dir exists and is a directly
    if (-e $dir and -d $dir) {
        $dirstate = 'homeexists';
    } else {
        $dirstate = 'nohome';
    }

    # here you have knowledge of which home dirs do and do not exist in $dirstate
    print "$name:$uid:$gid:$gcos:$dir:$shell:$dirstate\n";
}

或者,如果您确实想使用 bash 命令,这个衬垫的作用几乎相同:

getent passwd | awk -F: '{printf "%s %s\n",$1,$6}' | while read i; do home=($i); if [ ! -d ${home[1]} ]; then home+=("nohome") ; fi ; echo ${home[@]}; done

至于哪些主目录没有用户,因为主目录可以位于文件系统上的任何位置,我不确定如何最好地实现这一点。您可以用来ls查看 中的内容/home并与您从 中获得的用户进行比较getent(如果这是您需要做的)。

相关内容