Comment puis-je utiliser ssh pour exécuter une commande sur une machine Unix distante et quitter avant la fin de la commande?


17

Comment puis-je utiliser ssh pour exécuter une commande sur une machine Unix et quitter avant la fin de la commande?

Par exemple, si je tape

ssh localhost 'sleep 60 &'

ssh se bloque sur mon terminal jusqu'à la fin du sommeil, même si le sommeil est exécuté en arrière-plan.


Vous voulez probablement l' &extérieur des citations.
Brad Gilbert

1
Non, cela met tout le kit et kaboodle en arrière-plan et je ne peux pas taper mon mot de passe.
Richard Hoskins

Réponses:


19

SSH a un commutateur -f qui fait exactement la même chose que l'utilisation de nohup sur votre client mais permet à ssh de demander un mot de passe. Utilisez-le comme ça:

ssh localhost -f 'command'

Mais : SSH vivra toujours en arrière-plan, donc si vous arrêtez le client avant la fin de la commande sur le serveur, il sera abandonné. Si vous souhaitez que la connexion ssh soit fermée après l'exécution de la commande, vous pouvez utiliser l'écran côté serveur:

ssh localhost -f 'screen -d -m sleep 60'

Si je fais 'ssh remotemachine -n' commande longue exécution> avecremoteredirects 2> & 1 </ dev / null & 'et que le client s'arrête, la commande se terminera-t-elle?
Richard Hoskins

Afaik no. Si les connexions ssh sont perdues, le démon ssh devrait terminer tous les terminaux "à l'intérieur" de ssh. Depuis que le terminal a démarré la commande vers laquelle ils se termineraient, car leur processus parent s'est terminé. Mais ça vaut le coup d'essayer;)
Martin

Qu'en est-il de «nohup» au lieu de «écran» côté serveur?
Richard Hoskins

@ Brad Gilbert Rien? Je peux penser à quelques choses, mais une chose qu'elles n'ont pas en commun, c'est que 'screen' n'est pas disponible sur toutes les machines POSIX.
Richard Hoskins


6

Utilisez nohup, redirection stdout / stderr et exécutez la commande en arrière-plan:

 nohup ssh localhost 'sleep 60' >/dev/null 2>/dev/null &

EDIT: Ou encore mieux, utilisez simplement le paramètre -f de ssh:

ssh -f localhost 'sleep 60'

Vous pourriez probablement combiner les deux redirections avec &>/dev/null.
Brad Gilbert

@BradGilbert Cette syntaxe n'est pas compatible POSIX; il est difficile d'argumenter pour sacrifier la compatibilité afin de sauver quelques caractères.
tripleee

2

Ou après la connexion à l'aide de ssh, commencez screensi vous souhaitez revenir plus tard, pour regarder la progression ou la sortie.


Vous pouvez également utiliser "tmux" que je trouve personnellement plus facile à configurer. Les deux applications sont à peu près équivalentes, chacune ayant ses avantages et ses inconvénients.
mzuther
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.