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.
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
-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;-R 2222:127.0.0.1:22
créera le tunnel inverse;-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: