&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
Malheureusement, sftp se contente d'exécuter toutes les requêtes du fichier d'entrée les unes après les autres, il n'y a pas de mécanisme permettant de tester si le transfert a fonctionné ou non.
Comme les macros de commande ne peuvent pas être utilisées, y a-t-il des alternatives ? Le produit gnu_tools est livré avec un programme appelé expect. Il peut être utilisé pour envoyer des commandes, attendre un nombre quelconque de réponses différentes et faire quelque chose en fonction de ce qu'il voit dans le flux de sortie. Je ne suis pas un expert en expect, mais le script de la figure 6 vous aidera à démarrer. Si vous cherchez sur le web des "scripts expect", vous trouverez de nombreuses références qui vous aideront à personnaliser mon exemple simple.
# If we get an end-of-file (eof) it means that the sftp process # Cette procédure fait des correspondances d'expression régulière en recherchant des chaînes de caractères clés# dans la sortie collectée de la commande qui a été exécutée. Dans ce cas # Je ne fais que signaler le type d'erreur, mais d'autres choses peuvent être faites # aussi. Je ne vérifie également que deux erreurs. Il y en a d'autres. Vous aurez # pour les ajouter au fur et à mesure que vous les trouvez. # proc checkforerrors {buf cmd} { if [regexp {.*not found} $buf] { met "$cmd FAILED : not foundnnn" retour 1 } if [regexp {.*Permission refusée} $buf] { met "$cmd FAILED : problèmes d'accèsnnn retour 1 } retour 0 }# Réglez le délai d'attente sur -1 pour qu'il n'y ait pas de délai d'attente. La valeur par défaut est de 10 secondes # et la plupart des transferts de fichiers prennent plus de temps que cela. J'ai décidé de ne pas mettre # timeout, vous pouvez changer ça. régler le délai d'attente -1 # start sftp # attendre l'invite sftp mais si nous obtenons une invite d'authentification, se terminant par # changer de répertoire pour les tests # appeler vérifier les erreurs en passant tous les caractères collectés jusqu'à l' send "put foor" (mettre le pied) send "get barr" envoyer "quitr |
expect sftp3.exp Nous nous sommes connectés au mauvais serveur ou le serveur a été rechargé.La clé du serveur doit être validée avant que ce script puisse être exécuté à nouveau. ready 10:41:10 |
expect sftp3.exp sftp> get barImpossible de statuer sur le fichier distant : Aucun fichier ou répertoire de ce type Fichier "/SysAdmin/Noah_Davids/sftp_test/bar" non trouvé. sftp> get bar FAILED : not foundready 10:42:11 |
Enfin, dans mon blog FTP, j'ai mentionné que le FTP était capable de lire des fichiers qui étaient encore ouverts et que cela a parfois entraîné le transfert de fichiers incomplets. J'ai suggéré que si la macro FTP attend qu'un fichier apparaisse à un endroit puis le transfère, la macro devrait vérifier qu'il n'est plus verrouillé. Le même problème peut se produire avec le SFTP et la solution est la même. Vous pouvez placer la vérification du verrouillage du fichier dans une macro de commande (figure 9) et ensuite, lorsque le fichier n'est plus verrouillé, appelez la fonction "Attendre" avec le script approprié.
&label AGAIN |