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.
Réponses:
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.
la source
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.mkfifo /tmp/commands
devrait être une meilleure solutionPersistance automatique à l'aide d'OpenSSH
Vous pouvez également utiliser la
ControlMaster
fonctionnalité 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
-M
comme commutateur de ligne de commande, soit activer l'ControlMaster
option dans votre~/.ssh/ssh_config
, par exemple:En outre, vous devez définir l'
ControlPath
utilisation des lignes suivantes dans votre~/.ssh/ssh_config
: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:
Cheerio, nesono
la source
ssh -N
démarre une session sans commande à distance, il ne semble pas y avoir d'options correspondantes dans ssh_config.En
/etc/ssh/ssh_config
plusla source
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:
Pour soumettre vos travaux à la file d'attente:
Vous pouvez bien sûr utiliser -S pour distribuer les tâches aux ordinateurs distants:
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:
la source
oui c'est possible avec une pipe:
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
la source
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
la source
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:
Et puis pour envoyer des commandes, écrivez-les dans FD 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.
la source