Envoyer une fonction par ssh

Le jeudi 23 juillet 2015 par Benjamin Boudoir

Il peut être utile dans un script d'envoyer du code sur un serveur afin d'obtenir des informations.

On peut avoir un script sur la machine, envoyer un script sur la machine et l'exécuter ou, moins chiant, envoyer une fonction.

Pour celà, on code une petite fonction, comme dans n'importe quel script :

function virttype()
{
  for infos in sda:physique vda:kvm xda:xen
  do
    device="/dev/$(echo "$infos" | cut -d':' -f1)"
    return=$(echo "$infos" | cut -d':' -f2)
    if [ -b $device ]
    then
      output=$return
    fi
  done
  if [ -z "$output" ]
  then
    output=vserver
  fi
  echo $output
}

Ici, un petit code pour deviner le type de virtualisation.

Et maintenant, on l'envoie :

SSHOPTS="-n -o NumberOfPasswordPrompts=0 -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"

for hostname in $(cat ./servers.txt)
do
  ssh $SSHOPTS $hostname "$(type virttype | sed '1d'); virttype" || echo "Unkown"
done

"type" indique comment chaque paramètre doit être interprété si on l'utilise en tant que commande :

me@localhost$ type echo
echo est une primitive du shell
me@localhost$ type bash
bash est /bin/bash
me@localhost$ type ls
ls est un alias vers « ls $LS_OPTIONS »

Et dans le cas d'une fonction, nous donne son code avec en en-tête "$fonction est une fonction".

Pour les options ssh utilisées : on veut une connexion rapide donc on accepte toutes les clefs, mais sans les stocker et si notre clef ne nous permet pas de nous connecter, on passe à la suite. Quand au "-n", c'est pour éviter d'envoyer l'input sur la machine distante (pratique dans le cas d'un "while read", par exemple).

Enfin, on lance un subshell qui va afficher uniquement la fonction (le sed retire la première ligne); ce qui va la charger sur le système distant, nous permettant de l'exécuter.

Simple et lisible.