Как вытащить строку из / etc / passwd, если соответствующая теневая запись - 999999? - PullRequest
5 голосов
/ 24 февраля 2010

Я хочу сравнить каждого пользователя в файле passwd с его записью в файле теней и распечатать всю строку файла passwd, если запись в файле теней соответствует 999999. Как проще всего это сделать в Perl этот? Или я полагаю, что я могу получить значения из одного файла и сопоставить их в другом файле? Каков наилучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 24 февраля 2010
awk -F":" 'FNR==NR&&$5=="99999"{user[$1];next}($1 in user)' /etc/shadow /etc/passwd

измените FNR==NR&&$5=="99999" на FNR==NR&&$5=="99999"&&$2!="!!", если вы хотите исключить строки с "!!"

2 голосов
/ 24 февраля 2010
#! /usr/bin/perl

use warnings;
use strict;

sub read_passwd {
  open my $fh, "<", "/etc/passwd" or die "$0: open: $!";

  my %passwd;
  while (<$fh>) {
    next unless /^([^:]+)/;
    $passwd{$1} = $_;
  }

  \%passwd;
}

my $passwd = read_passwd;

open my $fh, "<", "/etc/shadow" or die "$0: open: $!";
while (<$fh>) {
  my($user,$maxage) = (split /:/)[0,4];
  next unless $maxage eq 99999;
  if ($passwd->{$user}) {
    print $passwd->{$user};
  }
  else {
    warn "$0: no passwd entry for '$user'";
  }
}
0 голосов
/ 25 февраля 2010

Вы можете использовать AnyData :: Format :: Password :

#!/usr/bin/perl

use strict; use warnings;
use AnyData;

my $passwd = adTie(Passwd => 'passwd' );
my $shadow = adTie(Passwd => 'shadow' );

for my $user (keys %$shadow) {
    if ( $user->{fullname} and $user->{fullname} eq '999999' ) {
         print $passwd->{$user->{username}}{fullname}, "\n";
    }
}

Выход:

...
Privilege-separated SSH
RPC Service User
Anonymous NFS User
HAL daemon

Или:

for my $user (keys %$shadow) {
    if ( $user->{fullname} and $user->{fullname} eq '999999' ) {
        my @values = map { defined $_ ? $_ : '' }
            @{ $passwd->{$user->{username}} }{@fields};
        print join(':', @values), "\n";
    }
}
0 голосов
/ 24 февраля 2010
sudo perl -F: -lane '(1..eof)?($_{$F[0]}=$_):/999999/&&($_=$_{$F[0]})&&print' /etc/passwd /etc/shadow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...