Existe-t-il une commande sous Linux qui attend qu'elle soit terminée?

11

J'essaie de construire un fichier batch Windows, qui démarre putty / plink avec la redirection de port, et rien d'autre. La partie Windows est prête pour l'instant:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

Comme je ne veux pas autoriser l'exécution d'autres commandes après l'authentification, j'utilise ForceCommandavec une Match Userdéclaration:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

Le problème est que l'exécution de mon fichier de commandes démarre correctement le mastic, mais il se ferme immédiatement après l'exécution de l'écho de mon texte spécifié.

Mon idée est d'utiliser quelque chose comme ça:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

De cette façon, putty / SSH devrait maintenir la connexion active et ne quitte pas ma redirection de port.

J'ai pensé à des commandes comme yes, pingou read, mais elles

  • spamment ma fenêtre de terminal
  • sont en train de faire des choses / générer une charge CPU inutile
  • pourrait se fermer de façon inattendue, si quelqu'un appuie sur Entrée

Existe-t-il une commande qui ne fera rien, pour toujours, jusqu'à ce que quelqu'un la termine avec Ctrl + C ou ferme la connexion SSH en fermant la fenêtre de mastic?

Que dois-je utiliser waitTillControlC?

stuXnet
la source
J'ai trouvé des questions comme superuser.com/questions/587629/… , mais elles laisseraient à l'utilisateur un shell prêt.
stuXnet

Réponses:

13

Je ne comprends pas pourquoi toutes les autres réponses veulent utiliser une boucle ici, le sommeil peut attendre assez longtemps pour n'importe quel but pratique et n'utilisera aucun cycle d'horloge pour le faire.

Par exemple, il essaiera ici de dormir pendant cent ans douteux et le fera probablement assez pour se conformer à la demande de toute façon:

echo "Something"; sleep 36500d

Alternativement, cela devrait également bloquer jusqu'à ce que vous tapiez la Enterclé:

echo "Something"; read foo
jlliagre
la source
9

Essayez -Nplutôt cette option. De la plinkdocumentation :

-N        don't start a shell/command (SSH-2 only)

Il s'agit du même comportement que l' sshoption -N, comme décrit dans la page de manuel :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
chepner
la source
2
Cela devrait être la réponse acceptée. Les autres disent comment faire une solution de contournement, mais celui-ci dit comment le faire correctement .
Moshe Katz
Merci pour l'édition; n'ayant pas de boîte Windows à cocher, je ne pensais pas à chercher des documents Plink en ligne.
chepner
Cette réponse ne correspond pas à mes besoins, car I don't want to allow to execute other commands after authentication. -Naccomplirait cela du côté client, vous pouvez donc simplement supprimer -N pour exécuter d'autres commandes après l'authentification.
stuXnet
8

Cela devrait rester indéfiniment sans consommer une quantité (notable) de puissance CPU.

echo "Something" && while true; do sleep 9999; done

Je ne sais pas non plus si vous pouvez donner une commande comme dans la ForceCommandclause. Vous devrez peut-être mettre la commande dans un script shell.

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

Ce script doit bien sûr être dans un endroit et avoir des autorisations telles qu'aucun utilisateur ordinaire sur le serveur ne puisse y écrire.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Éditer

J'ai trouvé une commande qui semble plus élégante:

echo "Something" && tail -f /dev/null

tail -fattend qu'un fichier ou un flux renvoie des octets. (Sinon, utile pour regarder les journaux en temps réel.) /dev/nullNe renverra jamais d'octets. Et donc la commande dormira pour toujours.

nitro2k01
la source
En ce moment, j'essayais moi-même une boucle de sommeil - ouais, ça marche vraiment! Même directement avec ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet
tail -f /dev/nullest techniquement pire que la boucle 9999. Le processus se réveille toutes les secondes au lieu de toutes les 2 heures et 56 minutes.
jlliagre
Je l'ai trouvé ici: unix.stackexchange.com/questions/42901/… La personne qui répond à cette question affirme "(en supposant que cela utilise inotify en interne, il ne devrait y avoir aucun sondage ou réveil, donc à part être bizarre, cela devrait être suffisant) "Est-ce que cette déclaration ou l'hypothèse que la queue utilise inotifyincorrecte?
nitro2k01
L'hypothèse est correcte, tailest optimisée pour tirer parti inotifylorsqu'elle est disponible. Ce devrait être le cas par défaut avec la plupart sinon la totalité des distributions assez récentes. Cependant, je viens de tester sur un ordinateur portable Linux et j'ai observé une activité parasite avec la tailsurveillance /dev/null, il est donc pire que le sommeil en termes de cycles d'horloge.
jlliagre
Je ne crois pas que cela tailse réveillera toujours à chaque seconde. Une raison possible du résultat est que vous l'exécutez dans un terminal avec lequel vous pouvez communiquer tailpour une raison quelconque, mais sleeppas. Il n'y a aucune raison de tailréveiller faussement simplement la surveillance /dev/null.
nitro2k01
0

Vous pouvez simplement essayer ce qui suit:

echo "your commands" && while :; do sleep 1; done
user2783132
la source
1
Pour les futurs visiteurs, vous devez fournir un résumé de la façon dont cela fonctionne. Beaucoup le savent peut-être, mais vous ne pouvez pas supposer que tout le sera.
nerdwaller
Une sleeppériode plus longue sera plus facile sur le CPU, même si elle sleep 1devrait être suffisamment sûre sur tout ce qui a été construit au cours des deux dernières décennies ...
Shadur
:est un raccourci pour true. Je préférerais également une sleeppériode plus longue juste par principe.
nitro2k01
0

Vous essayez de résoudre ce problème du mauvais côté. Vous ne voulez pas que le shell ne sorte pas, vous voulez que le mastic laisse la fenêtre ouverte.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - décrit exactement ce que vous devez changer. Si vous souhaitez utiliser l'option "uniquement sur une sortie propre", ajoutez simplement exit 1à la fin de ForceCommand.

Edit: j'ai mal compris; vous ne souhaitez conserver que les ports redirigés, vous ne voulez pas conserver la sortie de ForceCommand. Dans ce cas, http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell ne fait-il pas ce que vous voulez?

Gabe
la source
Le problème n'est pas que la fenêtre se ferme mais que le tunnel ssh est arrêté. Dire à PuTTY de laisser la fenêtre ouverte maintient-il également le tunnel ssh?
Adrian Pronk