Como listar e filtrar usuários do Samba que precisam de uma mudança de senha?

2

Aparentemente, posso descobrir se um usuário do Samba precisa de uma alteração de senha ou não com o seguinte comando:

pdbedit -v -u userid | grep "Password must change"

Eu também vejo que posso listar todos os usuários do Samba com o comando:

pdbedit -L -v

Que gera cerca de 10 MB de dados formatados assim:

---------------
Unix username:        egbjt005$
NT username:          egbjt005$
...
Password must change: Thu, 16 Aug 2012 07:33:58 NZST
...
---------------
Unix username:        eghwj001$
NT username:          eghwj001$
...
Password must change: Fri, 20 Jul 2012 14:42:46 NZST
...

O ... indica várias linhas de dados que não são de interesse. A data será no passado se a senha estiver atrasada para ser alterada.

O que eu realmente quero é uma lista de userids começando com um prefixo de 2 caracteres em particular (vamos usar "por exemplo" como exemplo) que precisa de uma mudança de senha. Como posso fazer isso?

    
por Highly Irregular 12.08.2012 / 23:27

1 resposta

1

Vou dar alguns exemplos de pdbedit output que encontrei online. Você pode diferir; Se você puder fornecer alguns exemplos do que imprime, esse código pode ser mais adequado ao que você precisa.

Primeiro, você precisa encontrar os nomes de usuário que correspondem ao seu prefixo. Parece que pdbedit output está no formato username: foo , então você pode usar awk para fazer isso:

pdbedit -L -v | awk '/username:/ {print $2}'

Então precisamos encontrar nomes que começam com o seu prefixo, então vamos usar o grep:

pdbedit -L -v | awk '/username:/ {print $2}' | grep ^eg

Para ver se a senha de um usuário específico precisa ser alterada, podemos ver se grep encontrou essa sequência, marcando o código de retorno:

if pdbedit -v -u $name | grep -q "Password must change" ; then
    echo $name
fi

Colocando tudo junto com um loop que verifica cada nome:

for name in $(pdbedit -L -v | awk '/username:/ {print $2}' | grep ^eg); do
    if pdbedit -v -u $name | grep -q "Password must change" ; then
        echo $name
    fi
done

Atualizar depois de publicar um exemplo de saída

Esse formato claramente não foi criado por alguém que é fã de ferramentas normais de processamento de texto de linha de comando Unix! Embora você possa, claro, fazer qualquer coisa em qualquer idioma, eu provavelmente mudaria para algo como Python ou Perl para analisar esse. Eu escolhi Perl aqui porque a manipulação de datas e horários do Python é péssima.

#!/usr/bin/perl

use Date::Parse;

$now = time();
while (<>) {
    if (/Unix username:\s*(.*)/) {
        $username = $1;
    }
    if (/Password must change:\s*(.*)/) {
        $change = str2time($1);
        if ($change <= $now) {
            print "$username\n";
        }
    }
}

Isso imprimirá o nome de usuário do Unix de qualquer usuário cuja senha expirou. Use-o como:

pdbedit -L -v | perl parse.pl

Editar por autor da pergunta

O código final que usei foi:

#!/usr/bin/perl
use Date::Parse;
$now = time();
while (<>) {
    if (/Unix username:\s*(.*)/) {
        $username = $1;
    }
    if (/Password must change:\s*(.*)/) {
        $expiry = $1;
        $change = str2time($expiry);
        if ($expiry !~ /^never/ && $change <= $now && $username =~ /^eg[a-z]{3}\d+/) {
            print "$username expiry: $expiry\n";
        }
    }
}

Que produz uma saída assim:

egdfd001 expiry: Mon, 30 Jul 2012 08:12:02 NZST
egjpf001 expiry: Mon, 13 Aug 2012 07:50:03 NZST
    
por 13.08.2012 / 06:45