web-dev-qa-db-fra.com

Créer un script .sh pour vérifier si une connexion SSH existe et si ce n'est pas le cas, connectez-vous

Je me bats pour écrire ce que je suppose devrait être un script facile.

En gros, j'ai un ordinateur au travail, caché derrière un NAT auquel je n'ai pas accès. J'ai besoin de SSH sur cet ordinateur, donc la seule façon de faire est de définir une redirection de port inversée, où cet ordinateur NAT se connectera à mon serveur chez moi, tout en redirigeant un port pour lui-même, puis simplement en ssh via mon serveur domestique.

Le script .sh sera exécuté par l'ordinateur au travail toutes les 5 minutes et voici ce que j'aimerais qu'il fasse:

Vérifiez si une connexion ssh est active sur mon serveur et si oui, ne faites simplement rien et quittez le script.

Si aucune connexion active n'a été détectée, connectez-vous en exécutant "ssh [email protected] -i key.priv" et quittez le script.

Si la tentative de connexion ssh se bloque pour une raison quelconque, par exemple plus de 2 minutes, forcez la sortie du script (ne sachant pas si cela est possible, sinon, il n'est pas nécessaire qu'elle soit là)

Merci beaucoup pour vos conseils.

3
Askerman

Supposons que vous utilisiez la commande suivante pour établir votre connexion SSH (je préférerais utiliser le fichier .ssh/config qui simplifiera la commande ssh, mais ce n'est pas obligatoire):

ssh user@Host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa
  • les options -fTN pousseront la connexion en arrière-plan - j’ai écrit cette partie principale, car cet ensemble d’options est essentiel pour ma suggestion ci-dessous;
  • l'option -R 2222:127.0.0.1:22 créera le tunnel inverse;
  • l'option -i $HOME/.ssh/id_rsa indique le fichier d'identité.

Nous pouvons utiliser ps -aux | grep "<our command>" | sed '$ d' pour vérifier si la connexion est établie ou non. Sur cette base, notre script pourrait être:

#!/bin/bash
SSH_COMMAND="ssh user@Host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then exec $SSH_COMMAND
fi

Appelez ce script my_autossh, placez-le dans ~/bin et rendez-le exécutable. Puis exécutez crontab -e et ajoutez le travail suivant:

* * * * * $HOME/bin/my_autossh

Si vous ne voulez pas utiliser Cron, modifiez le script my_autossh de cette manière:

#!/bin/bash
SSH_COMMAND="ssh user@Host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

while true; do
    if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
    then eval $SSH_COMMAND
    else sleep 60
    fi
done

Et utilisez Nohup pour le mettre en arrière-plan:

Nohup my_autossh >/dev/null 2>&1 &

Lire aussi:

3
pa4080