如何在散列或数组中存储/ etc / passwd?

时间:2011-02-07 11:52:29

标签: linux perl

我想将/etc/passwd的内容存储在结构中,以便稍后我可以更新每个值,但我无法确定要使用哪种结构。

#!/usr/bin/perl

use warnings;
use strict;

open PASSWD, "/etc/passwd";
while(<PASSWD>) {

    chomp;
    my @f = split /:/;

    print "username $f[0]\n";
    print "password $f[1]\n";
    print "uid      $f[2]\n";
    print "gid      $f[3]\n";
    print "gecos    $f[4]\n";
    print "home     $f[5]\n";
    print "shell    $f[6]\n";
    print "--------------------------\n";

}

我认为它应该是一个哈希数组,其中用户名是关键,但我无法弄清楚如何做到这一点。

“阵列哈希数组”是否可行?

3 个答案:

答案 0 :(得分:12)

请参阅Passwd::Unix

  

摘要

     

Passwd::Unix为标准Unix文件提供了一个抽象的面向对象和函数接口,例如/etc/passwd/etc/shadow/etc/group。此外,该模块提供了测试新软件的环境,而无需使用/etc

中的系统关键文件

答案 1 :(得分:3)

将其存储在哈希中,其中用户名为键,分割数组为值:

my %passwd = ();

open PASSWD, "/etc/passwd";
while(<PASSWD>) {

    chomp;
    my @f = split /:/;
    @{$passwd{$f[0]}} = @f;
}
print $passwd{'Sjoerder'}[3];

答案 2 :(得分:2)

您选择的数据结构实际上取决于您要对数据执行的操作。如果您最感兴趣的是为给定用户提取数据,那么您可以使用直接哈希,其中键是用户名,给定键的值是对/ etc / passwd中值的数组的引用: / p>

open PASSWD, '/etc/passwd';
my %users;
while (<PASSWD>) {
    chomp;
    next if /^\s*#/; # ignore comments
    my ($username, @details) = split /:/;
    $users{$username} = \@details;
}

# get values for user 'root'
my $values = $users{'root'};

# print root's home
print $values->[4];

如果您希望能够以可读的方式迭代所有用户并提取详细信息,您可以选择一个哈希数组,其中每个哈希表示一个用户,并具有用户名,密码,uid等的键:

open PASSWD, '/etc/passwd';
my @users;
while (<PASSWD>) {
    chomp;
    next if /^\s*#/; # ignore comments
    my @f = split /:/;
    my %hash;
    @hash{'username','password','uid','gid','gecos','home','shell'} = @f;
    push @users, \%hash;
}
for my $user (@users) {
    print "User $user->{username} has home $user->{home}\n";
}

希望这会给你一些想法!