为什么我的getpwent()调用返回错误的用户?

时间:2013-01-18 18:17:05

标签: perl

我总是忘记在Perl中如何做到这一点。 这是我的剧本:

#!/usr/local/bin/perl -w
use strict;
use Data::Dumper;

my @got = getpwent();
my $username    = ${[getpwent()]}[0];

print Dumper( @got );
print "username is [$username]\n";

......这是它产生的输出......

$VAR1 = 'root';
$VAR2 = 'xxxxxxxxxxxxxxxxxx';
$VAR3 = 0; 
$VAR4 = 0;
$VAR5 = ''; 
$VAR6 = '';
$VAR7 = 'myhost root';
$VAR8 = '/root';
$VAR9 = '/bin/bash';
username is [bin]

...我的问题是,为什么用户名等于'bin'而不是'root'?

2 个答案:

答案 0 :(得分:5)

它迭代用户;你正在调用它两次,并为两个用户获取信息。

$ perl -E 'say $foo while $foo = getpwent()'
root
daemon
bin
sys
sync
...

答案 1 :(得分:3)

重复调用getpwent会返回密码文件中的不同行(或getpwent正在使用的任何用户信息来源)。

root是您的密码文件中列出的第一个用户,bin是第二个。

调用endpwent重置迭代器并将以前的调用复制到getpwent

for (0..2) {
    print scalar getpwent(), "\n";
}
print "-- reset --\n";
endpwent();
for (0..3) {
    print scalar getpwent(), "\n";
}

输出(YMMV)

SYSTEM
LocalService
NetworkService
-- reset --
SYSTEM
LocalService
NetworkService
Administrators