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.

Richard Hoskins
la source
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'
Martin
la source
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'
neu242
la source
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.

Arjan
la source
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