Verifique se o acesso sem senha foi configurado
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?
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.