web-dev-qa-db-fra.com

Établir une connexion SSH inversée par crontab à l'aide d'un script

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.

6
Denis

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.

Installer un chien de garde sur Ubuntu 16.04

_Sudo apt-get install watchdog
_

Comment fonctionne le chien de garde

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

Exemple _watchdog.d_ script

Prenons 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
_
  • J'ai ajouté _-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.
  • J'ai ajouté _-f_ à autossh pour qu'il s'exécute en arrière-plan.
  • L'exemple de script utilise un modèle 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.

Configuration du chien de garde

_/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_.

Dépannage

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_.

1
Sam Gleske