Como suprimir o aviso de falha de autenticação do su?

0

Eu criei uma conta " diag " e a configurei como expirada ( usermod --expiredate 1 ). Então eu tenho um script que eu quero executar para entrar nele, então no script eu uso o seguinte comando:

su -s /bin/bash - diag

Isso gera assim:

Your account has expired; please contact your system administrator
su: Authentication failure
(Ignored)
diag@computer:~$

E então eu posso usar a conta, como esperado.

Eu quero suprimir as três primeiras linhas, o aviso sobre a conta expirada. Eu tentei adicionar 2> /dev/null ao final do comando, mas isso suprime toda a saída do bash; Acabei de receber uma resposta em branco, e posso digitar comandos nela e ver o resultado deles, mas não vejo nenhum prompt bash. Eu tentei adicionar apenas > /dev/null e isso não faz nada.

Então, deduzi que, aparentemente, su está direcionando toda a sua saída para stderr . Como posso obter su apenas para suprimir as primeiras três linhas, mas, por outro lado, agir normalmente como se a conta não estivesse expirada?

    
por Ricket 04.10.2012 / 19:24

2 respostas

1

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).

    
por 04.10.2012 / 21:07
0

Redirecionado stderr para stdout

su -s /bin/bash - diag 2>&1 >/dev/null

Este que eu não tentei, mas esperava que funcionasse (será atualizado em breve uma vez em casa)

discard=$(su -s /bin/bash - diag)
    
por 04.10.2012 / 19:56

Tags