Dans la catégorie mémo quasi indispensable ... expect vs scp / ssh
parceque mine de rien, c'est loin d'être simple de trouver une info claire sur le moyen d'encapsuler scp ou ssh dans un appel expect, particulieremnt si on ne veut pas passer par un script expect (en l'occurence, j'ai un script bash dep lusieurs miliers de lignes -oui, c'est discutable, mais bon..- et pas envie de splitter en 15000 fichiers..)
En gros le principe est le suivant, un appel a expect, et chainer les commandes (via le -c) sur le meme appel
A titre d'exemple le plus simple possible, on va imaginer qu'on veut creer le fichier "/tmp/fichierbidon" et l'envoyer sur un serveur au choix de l'utilisateur
#!/bin/bash
#Creation du fichier
echo "blahblah" > /tmp/fichierbidon
##On demande les infos concernant le serveur
echo "Indiquer le serveur"
read Serveur
echo "Indiquer le compte a utiliser pour se connecter au serveur"
read CompteDistant
echo "Indiquer le mot de passe pour le compte $CompteDistant@$Serveur"
stty -echo #On masque temporairement la saisie clavier
read MotDePasse
stty echo #On reactive l'affichage de la saisie clavier
echo "Ou souhaitez vous enregistrer le fichier ? (defaut: repertoire utilisateur de $CompteDistant)"
read RepertoireStockageDistant
if [ "$RepertoireStockageDistant" == "" ]
then #si on n'a rien saisi, par defaut, on affecte "~" qui correspond au repertoire de l'utilisateur en cours
RepertoireStockageDistant="~"
fi#La partie nous interesse: expect
expect -c "set timeout -1" -c "spawn scp /tmp/fichierbidon $CompteDistant@$Serveur:$RepertoireStockageDistant" -c " expect_before {Are you sure you want to continue connecting (yes/no)} {send \"yes\r\"; exp_continue}" -c "expect {password} {send \"$MotDePasse\r\"; exp_continue} eof"
#Voila, c'et fait :)
Petites explication sur la ligne d'expect...
expect => pas de secret, on appelle expect
-c "set timeout -1" => on retirer le timeout, on s'assure qu'expect ne coupe pas la commande avant la fin si la liaison est pourrie et que le serveur met du temp a répondre, ou que le fichier est volumineux (la contrepartie, c'est que si ca ne se passe pas comme prévu, on va rester planté là...)
-c "spawn scp -r /tmp/fichierbidon $CompteDistant@$Serveur:$RepertoireStockageDistant" la commande que l'on veut lancer et pour laquelle expect va répondre a notre place (spawn lance la commande et la met en ecouter pour interagir avec)
-c " expect_before {Are you sure you want to continue connecting (yes/no)} {send \"yes\r\"; exp_continue}" => On indique a expect qu'il est possible (mais pas pas obligatoire) qu'il recoive le texte "Are you sure you want to continue connecting (yes/no)" avant celui qu'on lui demande d'écouter (cf '-c expect ..' ci dessous) et dans ce cas, il devra répondre "yes"
-c "expect {password} {send \"$MotDePasse\r\"; exp_continue} eof" => Le motif a ecouter pour declencher l'action est "password", dès qu'il le recoit, expect enverra la réponse a la place de l'utilisateur (en l'occurence "$MotDePasse\r" cad le mot de passe puis entrée)
Une option utile en phase de test; -d (a placer après expect et avant -c "set timeout -1"), cela permet d'indiquer ce que fait expect
Commentaires récents
Il y a 2 jours 2 heures
Il y a 6 jours 12 heures
Il y a 15 semaines 2 jours
Il y a 43 semaines 3 jours