Come creare uno script bash per verificare la connessione SSH?
-
05-07-2019 - |
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.
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.