J'ai récemment migré d'un serveur FreeBSD 4.x vers un serveur FreeBSD 8.0. J'utilise maintenant expect-5.43.0_3. Je ne me souviens pas de ce que l'ancienne version de l'attente est, et je ne peux pas vérifier rapidement, parce que le disque dur sur l'ancien système s'est écrasé dans les minutes de la fin de la migration ! (WHEW!)Attendez script, travailler pendant des années, se comporte de manière inattendue avec la nouvelle version Expect
Quoi qu'il en soit, j'ai un script attendu qui crée un fichier tar compressé et le transfère via FTP chaque nuit. Ce script a été exécuté avec succès pour YEARS. Soudainement, depuis la migration/mise à jour, ça ne fonctionne pas correctement, et je l'ai regardé et je l'ai tripoté pendant des JOURS sans pouvoir le réparer. Je veux m'assurer que chaque commande FTP s'est terminée avec succès avant de passer à la suivante, car les étapes suivantes incluent la suppression des anciennes versions sélectionnées du fichier sur le serveur distant, et je ne veux pas faire DELETIONS si les TRANSFERTS sont ne fonctionne pas bien.
donc - cette partie du script fonctionne encore:
...
spawn ftp $ftpmode $ftphost expect timeout {puts "\nftp connection timeout(implicit)\n"; exit 3} "timed out" {puts "\nftp connection timeout(explicit)\n"; exit 3} 530 {puts "Login failure!"; exit 3 } "\n230" expect timeout {puts "\nftp command prompt timeout before progress command\n"; exit 8} "ftp> " send "progress off\r" expect timeout {puts "\nftp command prompt timeout before hash command \n"; exit 9} "ftp> " send "hash 32768\r" expect timeout {puts "\nftp command timeout";exit 5} "ftp> " # For each archive file we find (this will catch us up if we've # been unable to transmit for a few days), send and delete foreach archive [glob -nocomplain ${archivestem}*$archiveext] { send "put $archive\r" expect "ftp> " {puts "ftp unexpected prompt 1"; exit 3} timeout {puts "ftp put timeout\n";exit 3} "\n150"
... Voici le flux de dialogue qui correspond à l'exécution du ci-dessus:
230 User XXXXXXX logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> progress off Progress bar off. ftp> hash 32768 Hash mark printing on (32768 bytes/hash mark). ftp> put crewsched-alldump-2010-02-27.tgz local: crewsched-alldump-2010-02-27.tgz remote: crewsched- alldump-2010-02-27.tgz 227 Entering Passive Mode (141,224,159,31,30,167) 150 Opening BINARY mode data connection for . ##################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### 226 Transfer complete. 21689518 bytes sent in 01:15 (280.27 KB/s)
(Remarque - les marques de hachage me permettent d'utiliser une valeur de délai d'attente faible et rapidement détecter si le script est accroché)
Jusqu'ici, tout va bien! Tout fonctionne encore comme il l'a fait pour la dernière SIX ANS, mais la ligne suivante échoue avec "ftp unexpected prompt 2", même si la chaîne recherchée, "\ n226" est CLAIREMENT dans le flux de dialogue Notez qu'il y avait, très clairement, un "\ n226" dans le flux de dialogue AVANT le "ftp>", mais je reçois toujours "ftp inattendu invite 2". J'ai essayé de le changer en "Transfer" ou "complete" mais ça a quand même eu le même effet. En ce moment, je cours le script SANS le contrôle de la réussite, mais clairement, je ne suis pas satisfait de cela, et c'est un accident qui attend de se produire, comme les étapes suivantes supprimer les anciens fichiers sélectionnés, que je ne veux pas faire si ces fichiers n'ont pas été transférés avec succès, quel test je n'ai pas actuellement. Je présume que quelque chose a changé avec la mise en mémoire tampon/la gestion du flux d'entrée et que j'ai besoin de changer cela pour qu'il "voit" le "\ n226" ou "Transfert" ou "terminer" avant de "voir" le ftp> "chaîne, mais pourquoi? Et, d'ailleurs, comment? :)
Plutôt que d'utiliser un script expect complexe, utilisez simplement la commande ncftpput du package ncftp.Il vous permet de placer un fichier sur un serveur ftp de la même manière que scp et renvoie une erreur non nulle. –
Appartient à superuser.com – t0mm13b
Avez-vous exécuté avec «exp_internal 1»? Ensuite, vous pouvez voir le flux d'entrée comme attendu le voit. –