Até onde eu sei, expiração e bloqueio de contas de usuário são funcionalmente a mesma coisa; as tentativas de login falharão, as tentativas de SSH falharão, etc. Pelo menos para os meus propósitos, elas são as mesmas.
Assim, no meu script, agora detecto se o usuário está vencido e, em caso afirmativo, bloqueie o usuário e defina a expiração como 'nunca'.
Parece algo assim:
# Takes 1 parameter, the username to check
# Returns 0 if the user is expired, or 1 if it is not expired.
function userExpired()
{
# These day values are just numbers, the number of days since the epoch.
local expireDay='grep $1 /etc/shadow | cut -d: -f8'
# If diag has no expiration date, it will be empty.
if [[ "$expireDay" -eq "" ]] ; then
return 1
fi
local today='perl -e 'print int(time/(60*60*24))''
local daysUntilExpire='echo $expireDay - $today | bc'
[[ $daysUntilExpire -lt 0 ]]
}
# Check if the diag user is expired and if so, lock and unexpire it.
userExpired diag && {
usermod --lock --expiredate -1 diag
}
Eu escrevi a função userExpired do código encontrado em esta postagem do fórum (modificada para caber no meu estilo de código e melhor nomeação de variáveis).