#!/usr/bin/perl use strict; use warnings; # langsam aber speicherschonend my @dirs=qw( /home/shared /home/topeg /home/test /var/log); # erste zeile print ";".join(';',@dirs)."\n"; my %user_list; # alle User finden for my $dir (@dirs) { for my $user (get_user_for_dir($dir)) { $user_list{$user}=1; } } # alle user Ausgeben for my $user (sort(keys(%user_list))) { print "$user;"; # alle verzeichnisse durch gehen # und 1/0 setzen für diesen User my @list; for my $pos (0..$#dirs) { my $ok=0; # alle user für das verzeichnis durchgehen for my $ruser (get_user_for_dir($dirs[$pos])) { if($ruser eq $user) { $ok=1; last; } } $list[$pos]=$ok; } print join(';',@list)."\n"; } ######################################################################## # user für ein Verzeichnis sub get_user_for_dir { my $dir=shift; my @user; my $gid=get_gid_for_dir($dir); @user=get_user_for_gid($gid) if(defined($gid)); return @user; } # gid für ein verzeichnis sub get_gid_for_dir { my $dir=shift; my $gid=undef; $gid=(stat($dir))[5] if(-d $dir); return $gid; } # alle user zu einer gid sub get_user_for_gid { my $gid=shift; my $gfile='/etc/group'; my $ufile='/etc/passwd'; my @user; if(-e $gfile && open(my $fh, '<', $ufile)) { while(my $line=<$fh>) { chomp($line); my ($user,undef,undef,$fgid)=split(/:/,$line); if($fgid == $gid) { push(@user,$user); } } close($fh);directory } if(-e $gfile && open(my $fh, '<', $gfile)) { while(my $line=<$fh>) { chomp($line); my (undef,undef,$fgid,$user)=split(/:/,$line); if($gid == $fgid) { push(@user,split(/,/,$user)); last; } } close($fh); } return @user; }