2010-12-13 76 views
7

Pouvez-vous s'il vous plaît expliquer exactement ce que fait la dernière ligne de ceci, et pourquoi est-ce nécessaire?Script Bash: Qu'est-ce que cela signifie? "done</ dev/null & disown"

while true; do 
    /usr/bin/ssh -R 55555:localhost:22 -i ~/.ssh/tunnel-id [email protected] 
    sleep 1 
done < /dev/null & disown 

C'est le script entier, et son but est de créer un tunnel SSH à un serveur relais. Je suis nouveau à Bash, mais il semblerait qu'il essayera continuellement de maintenir la connexion en vie, mais je ne comprends pas la syntaxe de la dernière ligne.

Ce script fait partie d'un processus pour utiliser SSH un pare-feu, ou dans mon cas un NAT: http://martin.piware.de/ssh/index.html

Répondre

7

La dernière ligne redirige /dev/null dans la boucle en entrée - qui retourne immédiatement EOF - et exécute le processus en arrière-plan. Il exécute ensuite une commande disown (1) au premier plan, qui détache le processus, empêchant les signaux HUP de l'arrêter (comme le fait Nohup). l'effet est de faire de la boucle quelque chose comme un processus démon.

La boucle globale exécute la commande ssh une fois par seconde. La commande ouvre un tunnel ssh, le connectant localement au port 5555 et à distance au port 22 (ssh). S'il y a quelque chose à connecter, c'est le cas; sinon, l'EOF redirigé provoque son arrêt. Il essaye ensuite une seconde plus tard.

(Ou alors je crois, je ne l'ai pas fait essayé.)

En bash, désavouer est intégré; utilisez help disown pour voir les détails.

+0

Comment ça se passe "ssh: se connecter à l'hôte serveur server.com port 22: opération non autorisée", mais quand je commente la ligne "sleep 1", il semble fonctionner normalement. – drifter

+0

Pour quiconque lit ceci, il semble que ce soit un problème avec Cygwin car cela ne se produit pas dans ma distribution Linux. – drifter

2

La redirection de /dev/null dans la boucle while ferme effectivement ses stdin qui devrait être équivalente à exec <&-.

+0

Lorsque je l'exécute dans Cygwin, il sort "Pseudo-terminal ne sera pas alloué, car stdin n'est pas un terminal." Je suppose que c'est normal. – drifter

+0

@drifter: Je le crois. –

+0

Merci. Je reçois une erreur plus étrange. Si vous voulez revenir sur le commentaire que j'ai posté sur la réponse de Charlie Martin, je l'apprécierais. – drifter