J'ai un PC derrière un NAT qui établit une connexion SSH inversée avec mon VPC Digitalocean. J'utilise cette connexion SSH inversée à la maison pour me connecter à mon ordinateur de bureau (je suis autorisé à le faire), copier des fichiers et effectuer d'autres tâches importantes.
Bien que ce ne soit pas souvent le cas, j’ai remarqué que mon ordinateur de bureau redémarrait (suite à des pannes de courant, etc.) et rompait la connexion SSH inversée établie avec mon VPC. Dans ce genre de cas, je ne parviens pas à me connecter de mon PC à la maison à mon PC de bureau.
J'exécute le script suivant pour établir la connexion inversée + le proxy dynamique afin d'anonymiser mon trafic (car je ne suis pas obligé de partager les informations de navigation) généré sur le PC du bureau.
autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
Il est impossible que je relance ce script sur mon ordinateur de bureau lors d'un redémarrage, car je n'y suis pas physiquement. Afin de résoudre ce problème, j'ai installé la crontab suivante.
Remarque: le fichier rev.sh
contient la ligne ci-dessus. Le certificat "digitalOcean" et rev.sh se trouvent dans Ubuntu home
. Par conséquent, lorsque j'exécute ./rev.sh
sur mon terminal Ubuntu, j'obtiens un proxy dynamique et un accès à mon serveur DigitalOcean. Cette méthode fonctionne à 100%.
Cependant, lorsque j'installe la crontab avec la méthode suivante, mon ordinateur Ubuntu ne crée jamais de proxy dynamique. Je peux le voir car lorsque je vérifie ce proxy de Google Chrome, il indique que le proxy refuse la connexion.
Voici les tâches cron que j'ai essayées en tant que tâches cron de root. J'ai aussi essayé ceux-ci en tant qu'utilisateur normal, mais ils ne fonctionnaient toujours pas.
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
J'ai ensuite installé une crontab quelques minutes avant l'heure actuelle et j'ai attendu qu'elle s'exécute.
24 12 * * * bash /home/user/rev.sh
24 12 * * * /home/user/rev.sh
24 12 * * * reboot
Ceux-ci n'ont pas exécuté non plus.
J'ai aussi essayé 48 15 * * * bash /home/user/rev.sh >> test3
et */1 * * * * reboot -f >> test
mais le test3 et le test n'ont rien. Cependant, les fichiers ont été créés! par la crontab!
S'il vous plaît soyez assez aimable pour m'aider à repérer mon erreur. Il y a beaucoup de questions similaires sur ce site sur mon problème. J'ai donc renvoyé de nombreuses réponses, mais aucune d'entre elles n'a semblé aider.
Une meilleure solution serait d'utiliser un chien de garde. watchdog est un démon qui surveille les processus en cours et s’ils sortent, ils les redémarrent automatiquement.
_Sudo apt-get install watchdog
_
Le démon watchdog(8)
exécutera les scripts dans _/etc/watchdog.d
_ avec l'argument test
ou repair
. (voir la section TEST DIRECTORY
_ DE LA PAGE DE MANUEL watchdog(8)
). Votre script de surveillance gère ces deux arguments lorsqu'il vérifie si un processus est en cours d'exécution et entreprend une action pour le réparer.
Vous pouvez configurer le chien de garde en modifiant _/etc/watchdog.conf
_ (voir watchdog.conf(5)
).
watchdog.d
_ scriptPrenons par exemple _/etc/watchdog.d/autossh_script
_ (qui a des autorisations _755
_ et est la propriété de root
).
Remarque: vous devrez peut-être personnaliser la variable d'environnement _
$targetuser
_ dans l'exemple de script.sam
est mon nom d'utilisateur.
_#!/bin/bash
targetuser=sam
runTest=false
runRepair=false
case $1 in
test)
runTest=true
;;
repair)
runRepair=true
repairExitCode=$2
;;
*)
echo 'Error: script needs to be run by watchdog' 1>&2
exit 1
;;
esac
if ${runTest}; then
#run a test here which will tell the status of your process
#the exit code of this script will be the repairExitCode if it is non-zero
if ! pgrep autossh &> /dev/null; then
#autossh not running; notify watchdog to repair
exit 1
else
#autossh running; no action necessary
exit 0
fi
fi
if ${runRepair}; then
#take an action to repair the affected item
#use a case statement on $repairExitCode to handle different failure cases
su - ${targetuser} -c 'Nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
exit 0
fi
_
-N
_ à votre commande ssh
dans l'exemple de script afin qu'il ne démarre que le tunnel, mais ne tente pas de créer un shell de connexion.-f
_ à autossh
pour qu'il s'exécute en arrière-plan.pgrep
simple. Cependant, vous pouvez restreindre davantage le test à un utilisateur spécifique ou même utiliser un modèle pour le processus. Voir pgrep(1)
pour savoir comment personnaliser davantage votre test avec pgrep._/etc/watchdog.conf
_ et _/etc/defaults/watchdog
_ sont des emplacements pour configurer watchdog. Voir watchdog.conf(5)
.
Une chose à noter est que les scripts utilisateur sont exécutés une fois par seconde par défaut. Je recommande d'augmenter ce délai à au moins 30 secondes, à moins que vous n'ayez besoin de plus de vérification en temps réel. Réglez le paramètre interval
dans _watchdog.conf
_.
Vous devrez peut-être créer le répertoire _/etc/watchdog.d
_ avant votre script.
_/var/log/watchdog/*
_ contient les journaux et les erreurs liés à la surveillance. Si votre script renvoie stdout ou stderr, il sera écrit ici. Sur mon système, je remarque que mon script exécute test
ou repair
environ une fois par seconde. Si vous utilisez echo dans votre script, celui-ci ne doit être que temporaire, à des fins de débogage uniquement. Sinon, il est recommandé de supprimer la sortie, sauf en cas d'erreur.
Si votre script ne fonctionne pas du tout, vérifiez les autorisations suivantes: _ls -l /etc/watchdog.d
_.