web-dev-qa-db-fra.com

Script shell: exécuter la fonction à partir du script sur ssh

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?

38
Mr.Eddart

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.

83
alvits

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"
5
user2836202

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

3
Ushakov Vasilii