Je suis en train de créer un script bash qui permettrait de se connecter aux machines distantes et de créer des clés privées et publiques.
Mon problème est que les machines distantes ne sont pas très fiables et qu'elles ne sont pas toujours opérationnelles. J'ai besoin d'un script bash qui permettrait de vérifier si la connexion SSH est active. Avant de créer les clés pour une utilisation future.
Vous pouvez vérifier cela avec la valeur de retour que ssh vous donne:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
EDIT: Une autre approche serait d’utiliser nmap (vous n’avez pas besoin de clés ni de 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)
Mais vous devrez grep le message (nmap n'utilise pas la valeur de retour pour indiquer si un port a été filtré, fermé ou ouvert).
EDIT2:
Si l'état actuel du port ssh vous intéresse, vous pouvez remplacer grep open
par egrep 'open|closed|filtered'
:
$ nmap Host -PN -p ssh | egrep 'open|closed|filtered'
Juste pour être complet.
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
Vous pouvez utiliser quelque chose comme ça
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@Host echo ok 2>&1)
Cela affichera "ok" si la connexion ssh est ok
En complétant la réponse de @Adrià Cidre
vous pouvez faire:
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
Essayer:
echo quit | telnet IP 22 2>/dev/null | grep Connected
Si vous souhaitez vérifier qu'un dossier distant existe, ou tout autre test de fichier réellement:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
N'oubliez pas les guillemets dans "$(ssh ...)"
.
Exemple d'utilisation du 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
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-Host.html
Le lien ci-dessus consiste à créer le script Python pour vérifier la connectivité. Vous pouvez utiliser une méthode similaire et utiliser:
ping -w 1 -c 1 "IP Address"
Commande pour créer un script bash.
Pour vous connecter à un serveur avec plusieurs interfaces
ssh -o ConnectTimeout=1 -q [email protected];[ $? = 1 ] || ssh -o ConnectTimeout=1 -q [email protected]
Au cas où quelqu'un souhaiterait seulement vérifier si le port 22 est ouvert sur une machine distante, cette simple commande netcat est utile. Je l'ai utilisé parce que nmap et telnet n'étaient pas disponibles pour moi. De plus, ma configuration ssh utilise le mot de passe clavier auth.
C'est une variante de la solution proposée par GUESSWHOz.
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"