BASH: calcula o número de dias para expirar a conta

2

Objetivo: Saída do nome de usuário do Linux, passwordlastchanged, passwordexpires em formato legível por humanos.

Eu obtive informações do usuário de /etc/passwd e /etc/shadow para usuários com shell /bin/bash

join -1 1 -2 1 -t : /etc/passwd /etc/shadow |grep bin/bash|awk -F\: '{print $1";"$9";$14}'
where
$1 = username
$9 = number of days since last password change, calculated from 1/1_1970
$14 = number of days to password expiry date, calculated from 1/1_1970

Eu posso conseguir um número semelhante a $ 9 e $ 14 para a data atual

expr $(date +%S) /86400

Pergunta: Como faço para produzir o valor de $ 9 - $ (date +% s) / 86400 e $ 14 - $ (date +% s) / 86400 no meu atual liner?

    
por DavDav 16.10.2018 / 13:02

2 respostas

2

Por favor, esteja ciente de que o campo 8 em /etc/shadow NÃO contém "data de expiração da senha", mas de acordo com man shadow (no linux):

account expiration date

The date of expiration of the account, expressed as the number of days since Jan 1, 1970. Note that an account expiration differs from a password expiration. . . An empty field means that the account will never expire.

Você deseja "expiração de senha" ou "expiração de conta"?

Com o join da sua pergunta, todos os campos "sombreados" serão alterados por 6 para uma avaliação mais aprofundada. O comando grep é desnecessário; awk pode fazer isso. Tente esta adaptação do seu one-liner:

join -1 1 -2 1 -t : /etc/passwd /etc/shadow | awk -F: -v"TD=$(date +%s)" 'BEGIN {TD = TD / 86400} $7 ~ /bash$/ {print $1, int($9-TD), $14?int($14-TD):"never"}' OFS=";"
user1;-1429;never
user2;-1429;never
    
por 16.10.2018 / 15:56
3

Use echo da seguinte forma:

 echo "$(($9-$(date +%s)/86400 ))"

$((...)) é uma expansão aritmética.

O uso de ... em $((...)) será interpretado como uma expressão aritmética. Por exemplo, uma string hexadecimal será interpretada como um número e convertida em decimal. A expressão inteira será então substituída pelo valor numérico ao qual a expressão é avaliada.

$((...)) deve ser citado para não ser afetado pela divisão de palavras do shell e globalização de nome de arquivo.

ou

echo "$9-$(date +%s)/86400" | bc

bc significa calculadora básica e pode lidar com operações matemáticas.

    
por 16.10.2018 / 13:31