我需要开发一个 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
(如果这是您需要做的)。