Imprimindo usuários sem diretórios / home e diretórios / home sem usuários

0

Eu preciso desenvolver um script perl que gere uma listagem formatada de qualquer usuário sem um diretório home e qualquer diretório home que não esteja conectado a um usuário. Por exemplo, se eu usasse o script abaixo para ler nos usuários do sistema como eu poderia imprimir quais usuários não têm um diretório base com base no deles UID :

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

E se eu ler nos diretórios pessoais do sistema com o script abaixo, como eu poderia imprimir quais diretórios não têm usuários conectados a eles?

open (HOMES, '-|' , 'ls /home' ) or die $!;
    @home_dirs = <HOMES>;
    close HOMES;
    
por Pat 14.05.2018 / 22:27

2 respostas

1

Se você estiver satisfeito com uma solução bash , isso gravará a lista de usuários sem diretórios pessoais em /home e os diretórios em /home que não têm usuários no banco de dados de senhas:

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

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.

    
por 15.05.2018 / 00:34