Existe-t-il un moyen intelligent d'exécuter une fonction Bash locale sur un hôte distant via ssh?
Par exemple:
#!/bin/bash
#Definition of the function
f () { ls -l; }
#I want to use the function locally
f
#Execution of the function on the remote machine.
ssh user@Host f
#Reuse of the same function on another machine.
ssh user@Host2 f
Oui, je sais que cela ne fonctionne pas, mais y a-t-il un moyen d'y parvenir?
Vous pouvez utiliser la commande typeset
pour rendre vos fonctions disponibles sur une machine distante via ssh
. Il existe plusieurs options selon la façon dont vous souhaitez exécuter votre script distant.
#!/bin/bash
# Define your function
myfn () { ls -l; }
Pour utiliser la fonction sur les hôtes distants:
typeset -f myfn | ssh user@Host "$(cat); myfn"
typeset -f myfn | ssh user@Host2 "$(cat); myfn"
Mieux encore, pourquoi s'embêter avec un tuyau:
ssh user@Host "$(typeset -f myfn); myfn"
Ou vous pouvez utiliser un HEREDOC:
ssh user@Host << EOF
$(typeset -f myfn)
myfn
EOF
Si vous voulez envoyer toutes les fonctions définies dans le script, pas seulement myfn
, utilisez simplement typeset -f
Comme ceci:
ssh user@Host "$(typeset -f); myfn"
Explication
typeset -f myfn
Affichera la définition de myfn
.
cat
recevra la définition de la fonction sous forme de texte et $()
l'exécutera dans le shell actuel qui deviendra une fonction définie dans le shell distant. Enfin, la fonction peut être exécutée.
Le dernier code mettra la définition des fonctions en ligne avant l'exécution de ssh.
Personnellement, je ne connais pas la bonne réponse à votre question, mais j'ai beaucoup de scripts d'installation qui se copient simplement en utilisant ssh.
Demandez à la commande de copier le fichier, de charger les fonctions de fichier, d'exécuter les fonctions de fichier, puis de supprimer le fichier.
ssh user@Host "scp user@otherhost:/myFile ; . myFile ; f ; rm Myfile"
Autrement:
#!/bin/bash
# Definition of the function
foo () { ls -l; }
# Use the function locally
foo
# Execution of the function on the remote machine.
ssh user@Host "$(declare -f foo);foo"
declare -f foo
affiche la définition de la fonction