Comment puis-je créer une connexion SSH persistante pour «diffuser» des commandes sur une période de temps?

9

Supposons que j'ai une application en cours d'exécution sur un PC qui envoie des commandes via SSH à un autre PC du réseau (les deux machines exécutant Linux).

Par exemple, chaque fois que quelque chose se produit sur # 1, je veux exécuter une tâche sur # 2. Dans cette configuration, je dois créer une connexion SSH à chaque commande.

Existe-t-il un moyen simple de le faire avec des outils de base Unix sans programmer d'application client / serveur personnalisée? Fondamentalement, tout ce que je veux, c'est établir une connexion via SSH, puis envoyer une commande après l'autre.

Jakub Arnold
la source

Réponses:

12

Je ne sais pas s'il peut être utilisé en production, mais vous pouvez faire quelque chose comme ceci:

créer un fichier sur # 1

1> touch /tmp/commands

Exécutez ensuite la commande:

1> tail -f /tmp/commands | ssh [email protected]

Cela ouvrira le fichier / tmp / commandes et commencera à envoyer son contenu au serveur xxxx (# 2) et l'exécutera ligne par ligne

maintenant, chaque fois que quelque chose se passe sur # 1:

1> echo "ls -l" >> /tmp/commands

ou

1> echo "reboot" >> /tmp/commands

tout ce que vous ajoutez au fichier / tmp / commandes sera envoyé à # 2 et exécuté. Assurez-vous simplement de ne rien exécuter d'interactif, ou de le gérer d'une manière ou d'une autre.

Vitaly Nikolaev
la source
C'est exactement ce que je cherchais, une solution très créative :)
Jakub Arnold
5
J'ajouterais que vous devriez utiliser tail -F, qui détectera que le fichier a été remplacé, donc quand il devient géant, vous pouvez l'effacer et recommencer avec un nouveau fichier.
DerfK
3
@DerfK, alternativement, mkfifo /tmp/commandsdevrait être une meilleure solution
solotim
18

Persistance automatique à l'aide d'OpenSSH

Vous pouvez également utiliser la ControlMasterfonctionnalité d'OpenSSH, qui ouvre un socket de domaine Unix pour la première connexion et réutilise cette connexion dans tous les appels suivants.

Pour activer la fonctionnalité, vous pouvez soit utiliser -Mcomme commutateur de ligne de commande, soit activer l' ControlMasteroption dans votre ~/.ssh/ssh_config, par exemple:

ControlMaster auto

En outre, vous devez définir l' ControlPathutilisation des lignes suivantes dans votre ~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

Pour maintenir une connexion persistante à un hôte, par exemple si vous souhaitez exécuter un script qui doit établir de nombreuses connexions ssh à l'hôte, dont aucune n'est persistante pendant toute la durée de vie du script, vous pouvez démarrer une connexion silencieuse à l'avance en utilisant:

ssh -MNf remotehost

Cheerio, nesono

nesono
la source
Je me suis connecté à faute de serveur juste pour +1 voter votre réponse. Le vôtre a fonctionné!
Karma
ssh -Ndémarre une session sans commande à distance, il ne semble pas y avoir d'options correspondantes dans ssh_config.
Jokester
2

En /etc/ssh/ssh_configplus

# Send keep alive signal to remote sshd
ServerAliveInterval 60
Sandra
la source
2

Si vous rencontrez beaucoup ce genre de choses, essayez Parallel . C'est comme dsh (shell distribué) mais a quelques fonctionnalités intéressantes comme le comptage des sémaphores et il est activement maintenu.

De la documentation:

EXEMPLE: GNU Parallel comme système de file d'attente / gestionnaire de lots

GNU Parallel peut fonctionner comme un simple système de file d'attente de travaux ou gestionnaire de lots. L'idée est de mettre les jobs dans un fichier et de faire lire GNU Parallel en continu. Comme GNU Parallel s'arrêtera à la fin du fichier, nous utilisons tail pour continuer la lecture:

echo >jobqueue; tail -f jobqueue | parallel

Pour soumettre vos travaux à la file d'attente:

echo my_command my_arg >> jobqueue

Vous pouvez bien sûr utiliser -S pour distribuer les tâches aux ordinateurs distants:

echo >jobqueue; tail -f jobqueue | parallel -S ..

Il existe de nombreux exemples qui ne font qu'effleurer la surface. En voici une cool.

EXEMPLE: Distribution du travail aux ordinateurs locaux et distants

Convertissez * .mp3 en * .ogg en exécutant un processus par cœur de processeur sur l'ordinateur local et le serveur2:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
Allen
la source
0

oui c'est possible avec une pipe:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

cela exécutera la commande echo "hi" sur host2

il vous suffit d'écrire un programme qui donne simplement les commandes (n'oubliez pas le;), puis de diriger cette sortie vers ssh

JMW
la source
0

Vous voudrez peut-être utiliser un programme comme dsh (Distributed SHell) conçu pour cela :), après l'avoir configuré avec des noms d'hôte et configuré l'authentification publickeya, vous pouvez l'utiliser pour exécuter des commandes sur plusieurs machines soit en série ("run sur la machine a puis exécutez sur la machine b ") ou en parallèle (" exécutez sur toutes les machines en même temps "). Ou faites simplement un script

#!/bin/sh
ssh machine -- $@
exec $@
XANi
la source
0

AVERTISSEMENT: Je ne peux pas tester cela en ce moment, car je suis sur une machine Windows avec bash mais sans ssh.

Dans un script bash, vous pouvez faire quelque chose comme ceci:

exec 4> >(ssh --ssh-options-here user@host)

Et puis pour envoyer des commandes, écrivez-les dans FD 4.

echo 'echo hi' >&4

Si vous le faites de cette façon, vous ne pouvez pas accéder facilement aux résultats des commandes, mais en fonction de votre question, il ne semble pas que vous en ayez besoin.

user253751
la source