Pergunta

Eu estou no processo de criação de um script que iria entrar em máquinas remotas e criar chaves públicas e privadas.

O meu problema é que as máquinas remotas não são muito confiáveis, e eles não são sempre para cima. Eu preciso de um script que iria verificar se a conexão SSH é para cima. Antes de realmente criar as chaves para uso futuro.

Foi útil?

Solução

Você pode verificar isso com o retorno de valor ssh dá-lhe:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

EDIT: Outra abordagem seria usar nmap (você não precisará ter chaves ou login-stuff):

$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`

$ echo $a
22/tcp open ssh
$ echo $b
(empty string)

Mas você vai ter que grep a mensagem (nmap não usa o valor de retorno para mostrar se uma porta foi filtrado, fechado ou aberto).

EDIT2:

Se você está interessado no estado real do ssh-port, você pode substituir grep open com egrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

Apenas para ser completa.

Outras dicas

ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK

Você pode usar algo como isto

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

A saída será "ok" se a conexão ssh é ok

Em complemento à resposta de @Adrià Cidre você pode fazer:

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

if [[ $status == ok ]] ; then
  echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
  echo no_auth
else
  echo other_error
fi

Tente:

echo quit | telnet IP 22 2>/dev/null | grep Connected

Apenas no caso de alguém deseja apenas para verificar se a porta 22 é aberta em uma máquina remota, este simples comando netcat é útil. Usei-o porque nmap e telnet não estavam disponíveis para mim. Além disso, a configuração do ssh utiliza autenticação de senha teclado.

É uma variante da solução proposta pela GUESSWHOz.

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"

Se você gostaria de verificar existe uma pasta remota, ou qualquer outro arquivo-teste realmente:

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

Não se esqueça as aspas em "$(ssh ...)".

Para se conectar a um servidor com múltiplas interfaces

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

Exemplo usando bash 4+ script:

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi

Eu sinto que você está tentando resolver o problema errado aqui. Você não deveria estar tentando fazer os daemons ssh mais estável? Tente executar algo como monit , que irá verificar para ver se o daemon está em execução e reiniciá-lo se ele isn' t (dando-lhe tempo para encontrar a raiz do problema por trás sshd fechando em você). Ou é o problemático serviço de rede? Tente olhar para man ifup. A Droga coisa toda como a encerrar em você? Bem, isso é um problema maior ... tente olhar para os logs (começar com syslog) para encontrar falhas ou serviços de hardware que estão fechando sua boxen para baixo (talvez um monitor de temperatura?).

Fazendo seus scripts tolerante a falhas é grande, mas você também pode querer fazer o seu tolerante a falhas boxen.

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