Leser: 1
|< 1 2 >| | 20 Einträge, 2 Seiten |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
sub parse_passwd { open(FILE,"<","$passwd"); while(<FILE>) { # $user = Login-Name des Benutzers # $x = stand früher das verschlüsselte Passwort, welches nun in /etc/shadow steht # $id = User-ID des Benutzers # $gid = ID der Hauptgruppe des Benutzers # $com = Kommentar/Beschreibung des Benutzers # $home = Home-Verzeichnis des Benutzers ($user,$x,$uid,$gid,$com,$home)=split(/:/,$_); if($uid >= 1000 && $user =~ /^[A-Za-z0-9]+$/) { push @{$passwd{$user}},"$uid $gid $com $home" unless exists $passwd{$user}; } } close(FILE); return \%passwd; } sub print_passwd { my $var=shift; print Dumper($var); } my $get_passwd=parse_passwd(); print_passwd($get_passwd);
1
2
3
4
5
6
7
8
$VAR1 = {
'daniel' => [
'1000 1000 daniel,,, /home/daniel'
],
'sshuser' => [
'1006 1010 /mirror/home/sshuser/'
]
};
1 2 3 4 5 6 7 8 9 10
sub print_passwd { my $hash_ref = shift; for my $k ( keys %$hash_ref ) { my $user = $hash_ref->{$k}; my $data = $hash_ref->{$k}->[0]; print "$user : $data\n"; } }
print values %$hash_ref;
Duff+2008-07-23 17:23:56--Danke für die super schnelle Antwort.
my $user = $k funktioniert mit deinem oberen Code-Beispiel.
Aber wie würdest du das parsen der Datei /etc/passwd "besser" machen???
Möchte es ja richtig lösen.
Danke.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#!/usr/bin/perl # vi:ts=4 sw=4 et: use strict; use warnings; #> global variables #> ---------------------------------------------------------------------------- my $file = '/etc/passwd'; #> sub routines #> ---------------------------------------------------------------------------- sub parse_passwd { my $passwdfile = shift; my %passwd = (); open my $fh, '<', $passwdfile or die "$passwdfile: open(ro) failed: $!\n"; while ( my $line = <$fh> ) { chomp $line; my ( $user, $pw, $uid, $gid, $com, $home ) = split m{:}, $line; if ( $uid >= 1_000 and $user =~ m{\A[A-Za-z0-9]+\z} and !exists $passwd{$user} ) { push @{ $passwd{$user} }, $uid, $gid, $com, $home; } } close $fh; return \%passwd; } sub print_passwd { my $hash_r = shift; for my $user ( keys %$hash_r ) { # unformatierte ausgabe print "$user: @{ $hash_r->{$user} }\n"; # formatierte ausgabe printf "%s: %d %d '%s' %s\n", $user, @{ $hash_r->{$user} }; # nur user listen, die nicht gid==100 sind if ( $hash_r->{$user}->[1] != 100 ) { printf "%s: %d %d %s %s\n", $user, @{ $hash_r->{$user} }; } } } #> main script #> ---------------------------------------------------------------------------- print_passwd( parse_passwd( $file ) ); __END__
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
#!/usr/bin/perl # vi:ts=4 sw=4 et: use strict; use warnings; #> global variables #> ---------------------------------------------------------------------------- my $file = '/etc/passwd'; #> sub routines #> ---------------------------------------------------------------------------- sub parse_passwd { my $passwdfile = shift; my %passwd = (); open my $fh, '<', $passwdfile or die "$passwdfile: open(ro) failed: $!\n"; while ( my $line = <$fh> ) { chomp $line; my ( $user, $pw, $uid, $gid, $com, $home ) = split m{:}, $line; if ( $uid >= 1_000 and $user =~ m{\A[A-Za-z0-9]+\z} and !exists $passwd{$user} ) { $passwd{$user} = { gid => $gid, uid => $uid, comment => $com, homedir => $home, }; } } close $fh; return \%passwd; } sub print_passwd { my $hash_r = shift; for my $user ( keys %$hash_r ) { # nur user listen, die nicht gid==100 sind if ( $hash_r->{$user}->{gid} != 100 ) { printf "%s: %d %d %s %s\n", $user, @{$hash_r->{$user}}{ qw( uid gid comment homedir) }; } } } #> main script #> ---------------------------------------------------------------------------- print_passwd( parse_passwd( $file ) ); __END__
Duff+2008-07-23 19:12:33--Hätte aber mal wieder ne Frage:
1.) In Zeile 26 schreibst du als regex "m{\A[A-Za-z0-9]+\z}". Was bedeutet nochmals das \A...\z dazwischen? (so eine Art Wortgrenze?)
Duff+2008-07-23 19:12:33--2.) Werden mit dem Ausdruck in Zeile 51 "@{$hash_r->{$user}}{ qw( uid gid comment homedir) };" die einzelnen Elemente aus dem Zweiten Hash durchlaufen, indem ich dort die Schlüssel angebe?
|< 1 2 >| | 20 Einträge, 2 Seiten |