2010-02-24 13 views
5

Quiero comparar cada usuario en el archivo passwd con su entrada en el archivo shadow e imprimir toda la línea del archivo passwd si la entrada en el archivo shadow coincide con 999999. ¿Cuál es la forma más fácil en Perl para hacer esto? ? ¿O supongo que podría descartar los valores de un archivo y hacer coincidir el otro archivo? Cual es la mejor manera de hacer esto?¿Cómo puedo sacar una línea de/etc/passwd si su entrada de sombra correspondiente es 999999?

+0

@Svante: correcto en la extrane Por ejemplo, apostrophe, pero yo diría que "its" es correcto: "compare cada [entry] del usuario en el archivo passwd con la entrada * its * [correspondiendo] en el archivo shadow. –

Respuesta

3
awk -F":" 'FNR==NR&&$5=="99999"{user[$1];next}($1 in user)' /etc/shadow /etc/passwd 

cambio FNR==NR&&$5=="99999" a FNR==NR&&$5=="99999"&&$2!="!!" si desea excluir líneas con "!!"

+0

Supoose Quiero excluir todas las líneas que contengan "!!" ? – paul44

+0

cambiar 'FNR == NR && $ 5 ==" 99999 "' a 'FNR == NR && $ 5 ==" 99999 "&& $ 2! =" !! "' – ghostdog74

+0

esto no funciona para mí - la salida es como 'cat/etc/passwd' – paul44

0
sudo perl -F: -lane '(1..eof)?($_{$F[0]}=$_):/999999/&&($_=$_{$F[0]})&&print' /etc/passwd /etc/shadow 
2
#! /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

Usted podría utilizar 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"; 
    } 
} 

Salida:

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

O:

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"; 
    } 
} 
Cuestiones relacionadas