Question connexe: initier la connexion ssh du serveur au client
La réponse à partir de là m'a beaucoup aidé, cette commande fait ce dont j'ai besoin:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
J'ai donc écrit le script pour me reconnecter tout le temps:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@Host
echo "restarting in 5 seconds.."
sleep 5
done
Et l'a ajouté au /etc/crontab
. Mais j'ai découvert que cela fonctionne si seulement je l'exécute "à la main" à partir de Shell, mais s'il est appelé par cron, ssh se connecte et se termine immédiatement. (donc, le script ci-dessus se reconnecte tout le temps)
De man ssh
, J'ai trouvé que pour les connexions en arrière-plan, je devrais l'appeler avec -n
clé, mais cela n'a pas aidé. Ensuite, j'ai simplement cherché des scripts similaires et j'ai constaté que cela fonctionne si j'appelle tail -f something
, c'est-à-dire une commande "sans fin", donc je viens de créer un fichier vide /tmp/dummy_file
et maintenant ma commande ssh ressemble à ceci:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@Host tail -f /tmp/dummy_file
Ça fonctionne maintenant! Mais, cette solution semble un peu moche, et je ne comprends pas vraiment les raisons réelles de ce comportement. Par hasard, j'ai essayé d'appeler bash
au lieu de tail -f
(bash
me semble aussi une commande "sans fin"), mais cela ne fonctionne pas.
Alors, quelqu'un pourrait-il expliquer ce comportement, et quelle est la bonne façon de créer une connexion ssh en arrière-plan pour garder le tunnel ssh inverse en place?
Il semble que vous souhaitiez que le -N
option pour ssh.
-N Do not execute a remote command. This is useful for just forwarding ports
(protocol version 2 only).
Je vous suggère fortement de considérer autossh
. Il possède certaines heuristiques qui lui permettront de déterminer si la perte de connexion est la raison sous-jacente et réduira la fréquence des tentatives de reconnexion. De plus, il surveille la connexion à l'aide de tunnels supplémentaires, ce qui le rend très utile pour des scénarios comme celui que vous demandez.
Si vous utilisez Ubuntu, par exemple, vous pouvez effectuer une recherche sur le Web pour autossh upstart
pour trouver des exemples utiles sur la façon de configurer Ubuntu pour que le tunnel soit maintenu de manière persistante.
J'utilise ceci pour garder une connexion tunnel ouverte sur mon serveur à tout moment pour certains services.
Je seconde suggestion de @ 0xC0000022L et j'utilise également autossh
. Je l'utilise pour maintenir une connexion SSH à partir de mon ordinateur portable car je la prends d'un endroit à l'autre et cela fonctionne simplement. J'utilise cette connexion pour tunneler les ports 25 et 2143 pour accéder à mes serveurs SMTP et IMAP personnels.
Voici le script que j'utilise:
$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash
autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o
Je conserve ensuite une entrée Host
dans mon $HOME/.ssh/config
fichier pour l'hôte imap-o
.
$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes
GatewayPorts yes
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa
Host imap-o
User sam
ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p
Le autossh_mail.sh
le script est exécuté sur mon bureau lorsque je me connecte. Vous pouvez y accéder via gnome-session-properties
.