Pergunta

Eu testaria através de um script Python se um login SSH sem senha foi configurado ou não. Se eu executar o comando SSH normal, ele esperará para aceitar a senha por algum tempo. Existe uma maneira de o comando ssh retornar um erro assim que o SSH solicitar uma senha.

É possível conseguir isso?

Foi útil?

Solução

O comando SSH aceita um grande conjunto de opções, portanto, assumindo que seu código Python está chamando os comandos do shell, faça o seguinte:

ssh -oNumberOfPasswordPrompts=0 <host> "echo hello"

Isso falhará instantaneamente se as chaves não foram configuradas e instantaneamente completas, se tiverem, qual é o motivo do comando que está sendo passado para o host. Isso lhe dá um teste simples.

Outras dicas

Paramiko aumentará um AuthenticationException Se você não passar uma senha para o SSHClient's .connect() Método e uma chave de trabalho não podem ser encontrados.

Você pode definir um parâmetro como comando ssh para experimentar apenas a chave pública no processo de autenticação e definir um modo de lote com um comando que sempre retorne true quando o comando é executado no host remoto. Com essa abordagem, você pode capturar o código de saída no var $? e tomar alguma decisão.

ssh -o PreferredAuthentications=publickey -o BatchMode=yes <host> /bin/true &> /dev/null
if [ $? -eq 0 ]; then
    #DO SOMETHING, THE CONNECTION WAS SUCCESSFUL
else
    #CONECTION DENIED
fi

Você pode capturar a saída personalizada para uma variável, encontrando a "permissão negada" na saída detalhada do comando ssh, como está no código a seguir.

PERMISION=$([ ! -z "$(ssh -v -o PreferredAuthentications=publickey -o BatchMode=yes <host> /bin/true 2>&1 | grep " Permission denied")" ] && echo "GRANTED" || echo "DENIED")
if [ $PERMISION == "GRANTED" ]; then
    #DO SOMETHING, THE CONNECTION WAS SUCCESSFUL
else
    #CONECTION DENIED
fi

Espero que isso ache você útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top