Attendez le script, les timeouts et la vérification des erreurs

J'espérais avoir un petit aperçu d'un script attendu que j'ai écrit.

Fondamentalement, nous avons ce script attendre pour effectuer un téléchargement sftp, l'authentification key n'est pas une option, et sftp est la seule méthode prise en charge par notre fournisseur, donc la nécessité de cela.

Je souhaite pouvoir décoller les timeouts et save un code d'erreur à des fins de script.

J'ai besoin de:

  • Connectez-vous au site sftp
  • Commencer le transfert
  • Détectez que le téléchargement a atteint 100%
  • Si le téléchargement ne frappe pas 100% dans un certain timeout, je souhaite save un code d'erreur à des fins de script.

Voici ce que j'ai jusqu'ici:

set timeout 10 spawn sftp user@xxx.xxx.xxx.xxx match_max 100000 expect "password: " send -- "PASSWORD\n" expect "sftp> " send -- "lcd /data/upload\n" expect "sftp> " send -- "put file_yyyymmdd\n" expect "*100%*" {send "quit\n" } \ timeout { exit 2 } expect "sftp> " send -- "quit\n" expect eof 

Je crois que le code fonctionne en fonction du timeout d'attente, ci-dessous est le journal de la session d'attente:

 spawn sftp user@xxx.xxx.xxx.xxx user@xxx.xxx.xxx.xxx's password: Connected to xxx.xxx.xxx.xxx. sftp> lcd /data/upload/ sftp> put file_yyyymmdd Uploading file_yyyymmdd to /home/user/file_yyyymmdd file_yyyymmdd 0% 0 0.0KB/s --:-- ETA file_yyyymmdd 100% 5835 5.7KB/s 00:00 quit sftp> quit 

Il semble que "quit" soit envoyé deux fois? Ce qui me semble logique b / c, il voit le 100% et envoie immédiatement "quitter" avant que l'invite ne soit prête.

Quels changements dois-je faire pour get mes résultats escomptés?

Toute aide serait très appréciée.

Sur une autre note, j'aimerais élargir ce script, ou créer un autre qui détecte quand la touche DES a changé, acceptez-le (envoyez-le oui) et continuez.

Cependant, j'aimerais savoir quand cela se produit, soit avec un code d'erreur, soit en écrivant quelque chose dans un file journal …

J'ai essayé ce qui suit mais ça ne fonctionne pas comme prévu:

 set timeout 10 spawn sftp user@xxx.xxx.xxx.xxx match_max 100000 expect "Are you sure you want to continue connecting (yes/no)? " {send "yes\r" } \\ timeout { exit 0 } sleep 2 exit 3 expect eof 

La pensée était d'utiliser les codes de sortie pour déterminer si la key devait être mise à jour, mais elle revient toujours comme code de sortie 3 (la key a changé) et n'a pas envoyé de «oui» lorsque la key a effectivement changé.

Encore une fois, toute aide serait grandement appréciée.

Pour le timeout d'attente:

 expect "*100%*" {send "quit\n" } \ timeout { exit 2 } expect "sftp> " send -- "quit\n" expect eof 

devrait être changé (formaté différemment pour plus de clarté)

 expect { "*100%*" { } timeout { exit 2 } } expect "sftp> " send -- "quit\n" expect eof 

La section "*100%*" { } dit de quitter la déclaration d'attente et de passer à la ligne suivante:

expect "sftp> "

Le changement de key DES devrait s'avérer nécessaire si les parenthèses échappaient. Essayez de configurer exp_internal 1 dans votre script pour voir de meilleurs messages de debugging. Il peut ne pas correspondre correctement.

edit: Il pourrait également s'agir de l'espace à la fin.