Comment écrire un script bash, qui se connecte à une autre machine pour faire des choses?

Est-il possible décrire un script bash, qui

  1. serait lancé depuis la machine A, se connecte sur un autre machine B par ssh (les deux machines A et B seraient des machines Linux),
  2. copie certains fichiers sur la machine B
  3. exécute un script python un script python donné sur ces machines.
  4. transfère les résultats à la machine A
  5. se déconnecte de la machine B.

Est-ce techniquement faisable?

Réponse

Bien sûr, cest faisable:

scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./ 

et cest tout …

Mais il y a un problème: il vous sera demandé trois fois le mot de passe. Pour éviter cela, vous pourriez générer des clés ssh et autoriser les utilisateurs avec ces clés.

Pour générer ssh Les clés exécutent ssh-keygen -t rsa, répondent aux questions et copient la clé publique vers lhôte distant (machine B) dans le fichier ~/.ssh/authorized_keys. La clé privée doit être enregistrée dans ~/.ssh/id_rsa sur la machine locale (A).

Commentaires

  • Si les clés publiques ne sont pas une option, vous pouvez faire quelque chose de grossier pour minimiser les invites de mot de passe comme cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Si vous le faites souhaitez utiliser le mot de passe, vous pouvez toujours utiliser le regroupement de connexions OpenSSH ' en définissant ControlMaster=yes et ControlPath=/path/to/socketfile, puis démarrez une connexion ssh avec -f pour exécuter un ssh en arrière-plan. Dites à toutes les connexions SSH suivantes dutiliser le même fichier socket.

Réponse

Il est possible de tout faire en une seule ssh connexion / session:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst 

Ceci:

  1. Copies local_src à remote_dst,
  2. Exécute command,
  3. Copie remote_src vers local_dst.

Mais si command écrit sur stdout, le résultat avec également être dans local_dst. Si command lit lentrée de stdin, il recevra et EOF.

Réponse

Bien que vous puissiez le faire dans une seule session ssh, il « est un peu difficile de combiner la copie de fichiers avec des commandes en cours dexécution.

Le moyen le plus simple de sattaquer à cette tâche est dexécuter des sessions SSH séparées pour les trois opérations:

rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/ 

Cela nécessite de sauthentifier trois fois auprès de machineB. La méthode recommandée pour éviter de sauthentifier plusieurs fois est dutiliser la fonction de partage de connexion dans les versions modernes dOpenSSH: démarrez une fois pour toutes une connexion principale à B et laissez SSH se greffer automatiquement sur cette connexion principale. Ajoutez ControlMaster auto et une ligne ControlPath à votre ~/.ssh/config , puis démarrez une connexion principale en arrière-plan, puis effectuez vos tâches.

ssh -fN machineB # start a master connection in the background # Subsequent connections will be slaves to the existing master connection rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/ 

Plutôt que dutiliser scp o rsync pour copier des fichiers, il peut être plus facile de monter le système de fichiers distant sous SSHFS . Cela prendra en charge la configuration dune connexion principale, en passant (en supposant que vous « ayez configuré votre ~/.ssh/config comme indiqué ci-dessus).

mkdir /net/machineB sshfs machineB: /net/machineB cp -Rp inputs /net/machineB/ ssh machibeB "some command -i inputs -o outputs" cp -Rp /net/machineB/outputs . 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *