Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/04/2011, à 17:25

RastaYoupi

Script bash combiné avec Expect

Bonjour tout le monde,

Dans le cadre d'un projet perso sur Truecrypt, je souhaiterai effectuer différentes actions avec des scripts automatisés.
La CLI de Truecrypt étant assez verbeuse (elle pose trop de questions !) cela rend l'automatisation encore plus complexe, c'est pourquoi j'ai décidé d'incorporer de l'Expect.
Pour ceux qui connaissent un peu Truecrypt, je souhaite automatiser la restauration d'un header, voici ce que cela fait via un shell:

leseb@leseb-Studio-1557:~/Truecrypt$ truecrypt --restore-headers tc 
Please select the type of volume header backup you want to use:

1) Restore the volume header from the backup embedded in the volume
2) Restore the volume header from an external backup file

Select: 2


Are you sure you want to restore volume header of /home/leseb/Truecrypt/tc?

WARNING: Restoring a volume header also restores the volume password that was valid when the backup was created. Moreover, if keyfile(s) were/was necessary to mount the volume when the backup was created, the same keyfile(s) will be necessary to mount the volume again after the volume header is restored.

After you click Yes, you will select the header backup file. (y=Yes/n=No) [Yes]: y

Enter filename: bkph2-tc

Enter password for the header stored in backup file: 
Enter keyfile [none]: kf

Please type at least 320 randomly chosen characters and then press Enter:


The volume header has been successfully restored.

IMPORTANT: Please note that an old password may have been restored as well. Moreover, if keyfile(s) were/was necessary to mount the volume when the backup was created, the same keyfile(s) are now necessary to mount the volume again.

Et voici une ébauche de mon bash :

#!/bin/bash

VAR=$(expect -c "
spawn /usr/bin/truecrypt --volume-type=normal --restore-headers /home/leseb/Truecrypt/tc
expect \"Please select the type of volume header backup you want to use:\n1')' Restore the volume header from the backup embedded in the volume\n2')' Restore the volume header from an external backup file\nSelect:\" 
send  \"2\r\" 
expect "Are \you sure you want to restore volume header of /home/leseb/Truecrypt/.tc?\
\nWARNING: Restoring a volume header also restores the volume password that was valid when the backup was created. Moreover, if keyfile'('s')' were/was necessary to mount the volume when the backup was created, the same keyfile'('s')' will be necessary to mount the volume again after the volume header is restored.\
\nAfter \you click Yes, \you will select the header backup file. '('y=\Yes\/n=No')' [\Yes\]:"
send \"y\r\"
expect \"Enter filename:\"
send \"bkph1-tc\r\" 
")

echo "$VAR"

Mon erreur après l'exécution du script:

root@leseb-Studio-1557:~/Truecrypt# ./restore.sh 
couldn't read file "you": no such file or directory
spawn /usr/bin/truecrypt --volume-type=normal --restore-headers /home/leseb/Truecrypt/tc
Please select the type of volume header backup you want to use:

1) Restore the volume header from the backup embedded in the volume
2) Restore the volume header from an external backup file

Select: 2


Are you sure you want to restore volume header of /home/leseb/Truecrypt/tc?

WARNING: Restoring a volume header also restores the volume password that was valid when the backup was created. Moreover, if keyfile(s) were/was necessary to mount the volume when the backup was created, the same keyfile(s) will be necessary to mount the volume again after the volume header is restored.

After you click Yes, you will select the header backup file. (y=Yes/n=No) [Yes]: 

Le problème se situe au niveau du "you" (et de toute la ligne en fait si je décale le \), je ne vois même pas pourquoi il l'interprête m'enfin.
J'ai fait une variante sur la ligne qui foire, meilleure que celle d'avant car j'empêche l'exécution de tout ce qui se trouve entre les \ ,mais encore une erreur qui sort de je ne sais où :

expect \"Are you sure you want to restore volume header of /home/leseb/Truecrypt/.tc?\
\nWARNING: Restoring a volume header also restores the volume password that was valid when the backup was created. Moreover, if keyfile'('s')' were/was necessary to mount the volume when the backup was created, the same keyfile'('s')' will be necessary to mount the volume again after the volume header is restored.\
\nAfter \you click Yes, \you will select the header backup file. '('y=\Yes\/n=No')' [\Yes\]:\"

L'erreur retourné, on voit qu'il ne passe même pas la première étape (le Select:2) alors que lors de la dernière commande oui :

root@leseb-Studio-1557:~/Truecrypt# ./restore.sh 
missing close-bracket
    while executing
"expect "Are you sure you want to restore volume header of /home/leseb/Truecrypt/.tc?\nWARNING: Restoring a volume header also restores the volume pass..."
spawn /usr/bin/truecrypt --volume-type=normal --restore-headers /home/leseb/Truecrypt/tc
Please select the type of volume header backup you want to use:

1) Restore the volume header from the backup embedded in the volume
2) Restore the volume header from an external backup file

Select: 

Bref il est possible que je sois devenu aveugle à force de trafiquer tous ces caractères \ / ' " et que je ne vois pas le petit qui manque mais ça me prend bien le choux cette histoire donc je m'en remets à vous.
Merci d'avance !

ps: il y a des ' entre les ( car il n'aime pas les parenthèses aussi !

Hors ligne

#2 Le 22/04/2011, à 11:46

JoelS

Re : Script bash combiné avec Expect

Un premier conseil: fais un script expect direct, et pas un script expect dans du shell. Pour plusieurs raisons:

  1. tu vas t'embêter avec les quotes, backquotes, et autres slash et antislash et encore d'autres joyeusetés pour éviter les doubles interprétations entre le bash et expect

  2. expect est basé sur Tcl. On dira ce qu'on veut, (Tcl suck/rocks/whatever) mais Tcl reste un langage de script complet. Tout ce que tu peux faire avec bash, tu pourra le faire avec Tcl, et dans le cas d'un script expect, tu sera moins ennuyé par le point précédant

  3. le pilotage via expect des entrées/sorties fonctionnent très bien, mais tu peux avoir de drôles de surprises avec les caractères cachés et bizarres qu'une appli peut renvoyer. Et tu retombes dans le premier problème ci-dessus

  4. à la limite, si tu as à faire un script shell complet mais que seule une petite partie utilise expect, sors cette partie dans un script à part.

Ensuite tu peux passer des expressions régulières à la commande expect, tu n'es pas obligé de passer l'ensemble de la ligne que tu cherches. Essayes aussi de mettre en début de script expect les commandes log_info 1 et exp_internal 1, ça te donne pas mal d'info sur comment expect dialogue avec le processus, ce qu'il envoie et surtout ce qu'il reçoit.

Sur ce, bonne chance, moi, je pars en congé :-)

Hors ligne

#3 Le 26/04/2011, à 09:29

RastaYoupi

Re : Script bash combiné avec Expect

En effet je pense que l'appel d'un script Expect indépendant depuis mon bash me créera moins de conflits que l'intégration d'une commande Expect.
Merci du conseil.

Hors ligne