Est-il possible décrire un script bash, qui
- 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),
- copie certains fichiers sur la machine B
- exécute un script python un script python donné sur ces machines.
- transfère les résultats à la machine A
- 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
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:
- Copies
local_src
àremote_dst
, - Exécute
command
, - Copie
remote_src
verslocal_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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
etControlPath=/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.