Você pode fazer isso com uma combinação da opção BatchMode
e "analisar" a saída. ( ssh
sempre retorna 255 se não conseguir se conectar por qualquer motivo, então você não pode usar o código de retorno para distinguir entre os tipos de falhas).
Com BatchMode
ativado, nenhum prompt de senha ou outra interação é tentada, portanto, uma conexão que requer uma senha falhará. (Eu também coloco um ConnectTimeout
lá que deve ser ajustado para atender às suas necessidades. E escolhi nomes de arquivos realmente ruins.)
#! /bin/bash
rm good no_auth other
while read ip host ; do
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 $ip echo ok 2>&1)
case $status in
ok) echo $ip $host >> good ;;
*"Permission denied"*) echo $ip $host $status >> no_auth ;;
*) echo $ip $host $status >> other ;;
esac
done < list.txt
Você pode detectar outros tipos de erros (como a falta de chave pública do servidor), se precisar de classificação mais detalhada. Se você precisar dos resultados em um único arquivo ordenado, apenas cat
dos vários arquivos de saída juntos, conforme achar melhor.