Domanda

Sono in procinto di creare uno script bash che acceda alle macchine remote e crei chiavi private e pubbliche.

Il mio problema è che i computer remoti non sono molto affidabili e non sono sempre attivi. Ho bisogno di uno script bash che verifichi se la connessione SSH è attiva. Prima di creare effettivamente le chiavi per un uso futuro.

È stato utile?

Soluzione

Puoi verificarlo con il valore di ritorno che ssh ti dà:

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

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

EDIT: un altro approccio sarebbe quello di usare nmap (non avrai bisogno di chiavi o elementi di accesso):

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

Ma dovrai grep il messaggio (nmap non usa il valore di ritorno per mostrare se una porta è stata filtrata, chiusa o aperta).

EDIT2:

Se sei interessato allo stato attuale della porta ssh, puoi sostituire grep open con egrep 'open | closed | filtered' :

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

Solo per essere completo.

Altri suggerimenti

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

Puoi usare qualcosa del genere

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

Questo produrrà " ok " se la connessione SSH è ok

Completando la risposta di @ Adri & # 224; Cidre puoi fare:

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

Prova:

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

Nel caso in cui qualcuno desideri solo verificare se la porta 22 è aperta su una macchina remota, questo semplice comando netcat è utile. L'ho usato perché nmap e telnet non erano disponibili per me. Inoltre, la mia configurazione ssh utilizza l'autenticazione password tastiera

È una variante della soluzione proposta da GUESSWHOz.

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

Se vuoi controllare che esista una cartella remota, o qualsiasi altro file test veramente:

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

Non dimenticare le virgolette in " $ (ssh ...) " .

Per connettersi a un server con più interfacce

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

Esempio usando lo script BASH 4+:

# -- 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

Sento che stai cercando di risolvere il problema sbagliato qui. Non dovresti provare a rendere i demoni ssh più stabili? Prova a eseguire qualcosa come monit , che controllerà se il daemon è in esecuzione e riavvialo se non lo è ' t (dandoti il ??tempo di trovare il problema alla radice di sshd che ti sta chiudendo). O il servizio di rete è problematico? Prova a guardare man ifup . A Whole Damn Thing piace solo chiuderti su di te? Bene, questo è un problema più grande ... prova a guardare i tuoi registri (inizia con syslog) per trovare guasti hardware o servizi che stanno chiudendo la tua scatola (forse un monitor della temperatura?).

Rendere i tuoi script tolleranti ai guasti è grandioso, ma potresti anche voler rendere tolleranti i tuoi errori boxen.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top