Как я могу запустить passwd -S и записать его вывод в Perl? - PullRequest
3 голосов
/ 24 февраля 2010

Я хочу отсканировать файл passwd и печатать только строки, если пользователь не заблокирован. То есть passwd -S $user не возвращает «Пароль: заблокирован». Я могу легко сделать в кш. Каков наилучший способ сделать это в Perl?

Ответы [ 4 ]

2 голосов
/ 24 февраля 2010

Так же, как однострочный.

sudo perl -F: -lane 'print $F[0] if $F[1]!~/^!/' /etc/shadow
1 голос
/ 24 февраля 2010

Ранее в этом ответе сообщалось, как печатать только заблокированные пользователи. Ошибка исправлена.

В Linux заблокированная учетная запись пользователя имеет пароль, который начинается с '!'. Вы можете самостоятельно разобрать файл /etc/shadow, разделенный двоеточиями:

# Run as root with /etc/shadow as program argument
while (<>) {
    chomp;
    my ($user, $password, $remainder) = split /:/, $_, 3;
    print $user."\n" unless $password =~ /^!/;
}

Редактировать: Еще один переносимый способ - использовать функцию getpwent :

# Must run as root
while (my ($user, $password) = getpwent) {
    print $user."\n" unless $password =~ /^!/;
}

Примечание: Вы должны быть пользователем root, чтобы прочитать пароли пользователей из /etc/shadow и выяснить, заблокирован пользователь или нет.

0 голосов
/ 24 февраля 2010
open(F,"<","/etc/shadow") or die "Cannot open shadow file:$!\n";
while(<F>){
    chomp;
    @s = split /:/;
    if ( $s[1] !~ /!/){
        print "user: $s[0] not locked \n";
    }
}
close(F);

использовать как root.

0 голосов
/ 24 февраля 2010

Я не уверен, ищите ли вы способ командной строки сделать это или нет, и следующий код предполагает, что вывод passwd -S равен точно так, как вы его указали ( что, вероятно, не будет работать на практике), но это один из подходов:

cat /etc/passwd | perl -ne '$user = (split /:/)[0]; print "$user\n" if `passwd -S $user` ne "Password: locked"'

На практике вам, вероятно, понадобится какое-то волосатое регулярное выражение в конце, например:

`passwd -S $user` !~ /^\s*Password\s*:\s*locked\s*$/im'

Где 'i' в конце делает его нечувствительным к регистру (что, вероятно, не обязательно), а 'm' позволяет сопоставить несколько строк вывода [из passwd -S]. Трудно сказать точно, что вам нужно, не видя точного результата, который вы соответствуете (на вашем * nix).

Например, на Cygwin, я думаю, что эквивалент будет следующим:

`passwd -S $user` !~ /^\s*Account\s+disabled\s+:\s+yes\s*$/im'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...