Escrevendo um script que gera usuários locais e sua data de expiração de senha

2

Eu devo escrever um script que produza o nome real dos usuários locais e suas informações de expiração de senha.

Isso é o que eu tenho no momento. qualquer ajuda seria apreciada.

$ cat /etc/passwd | grep '/home' | cut -d: -f5 ;chage -l {} | \
    fgrep "Password expires"'| column -t
    
por John h 25.11.2014 / 20:04

3 respostas

1

Uma maneira melhor de obter usuários locais é ver se o usuário possui um shell de login válido:

getent passwd | grep -f /etc/shells

Aqui está algo que deve funcionar:

getent passwd | grep -f /etc/shells | tr ',' ':' | \
    awk -F: '{print $1, $5}' | while read USER NAME 
    do 
        echo $NAME:$(chage -l $USER| awk -F': ' '/Password expires/{print $2}')
    done | column -ts: 

Usando xargs , pode-se fazer:

getent passwd | grep -f /etc/shells | tr ',' ':' | awk -F: '{print $1, $5}' | \
    xargs -L1 bash -c 'echo ${@:2}:$(chage -l $1| awk -F": " "/Password expires/{print \}")' : | \
    column -ts: 
  • Usar tr para substituir o , por : nos permite levantar o nome completo diretamente do campo GECOS.
  • column pode receber um delimitador de entrada com -s , o que nos permite manter nomes com várias palavras em uma coluna.
  • -L faz xargs usar uma linha de entrada por comando, para que o nome de usuário e o nome completo sejam passados para cada comando.
  • ${@:2} - todos os parâmetros do segundo parâmetro em diante (ignorando o primeiro).

Exemplo de saída:

root                      never
Murukesh Mohanan          never
Guest                     never
    
por 25.11.2014 / 20:57
0

Você pode usar xargs para iterar os resultados da seguinte forma:

$ grep '/home' /etc/passwd | cut -d: -f1 | xargs -n1 -I{} chage -l {} | \
    grep "Password expires" | column -t
Password  expires  :  never

Nesta variação, chamamos xargs com a opção -n1 , por isso só chamará chage -l com um único argumento de nome de usuário. O -I{} informa xargs para usar {} como uma macro para que possamos marcar onde queremos colocar os argumentos ao chamar chage .

    
por 25.11.2014 / 20:54
0
cut -d: -f1,3,5 /etc/passwd | while IFS=: read -r user userid fullname
do
    if [ "$userid" -gt 500 ];
    then
    echo "Full Name: $fullname"
    echo "Password Expiry date: $(chage -l "$user" | head -2 | tail -1)"
    fi
done

Estou apenas adicionando a etapa extra de verificar os usuários locais, pois o arquivo /etc/passwd normalmente contém os usuários do sistema que não queremos. Além disso, estou usando um loop while para iterar o arquivo para melhor legibilidade.

    
por 25.11.2014 / 20:55