web-dev-qa-db-fra.com

Comment créer un script bash pour vérifier la connexion SSH?

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.

61
chutsu

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.

119
user156676
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
19
Brian Ott

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

14
Adrià Cidre

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
6
iarroyo

Essayer:

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

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 ...)".

0
Sheljohn

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
0
Mike Q

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.

0
Dheeraj Kumar

Pour vous connecter à un serveur avec plusieurs interfaces

ssh -o ConnectTimeout=1 -q [email protected];[ $? = 1 ] || ssh -o ConnectTimeout=1 -q [email protected]
0
neckTwi

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"
0
Mathieu C.