Já passou algum tempo desde que eu tenho usado o Perl, mas descobri algo que pode levar você aonde você precisa ir. Como você está usando o Perl, evitamos usar comandos 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";
}
Ou, se você realmente quisesse usar comandos bash, esse forro se aproxima do mesmo:
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
Quanto aos diretórios home que não possuem usuários, já que os diretórios home podem estar em qualquer lugar no sistema de arquivos, não tenho certeza de como isso pode ser feito. Você pode usar ls
para ver o que está em /home
e comparar com os usuários que você recebe de getent
, se é isso que você precisa fazer.