Maison >Tutoriel système >Linux >Scripting SFTP tolérant aux défauts - Reryant les transferts échoués automatiquement

Scripting SFTP tolérant aux défauts - Reryant les transferts échoués automatiquement

William Shakespeare
William Shakespeareoriginal
2025-03-18 10:48:24455parcourir

Scripting SFTP tolérant aux défauts - Reryant les transferts échoués automatiquement

introduction

Les architectures de réseau modernes sont construites sur des supports de transmission peu fiables. Le dispositif de routage peut éliminer, corrompre, réorganiser ou copier les données transmises à volonté. La couche IP dans la pile de protocole TCP / IP comprend qu'elle ne peut garantir la précision des données. Aucun réseau IP ne peut affirmer qu'il est 100% fiable.

La couche TCP agit comme le gardien au-dessus de la couche IP pour s'assurer que les données qu'elle génère est correcte. Ceci est réalisé grâce à une variété de techniques, et parfois les données sont délibérément perdues pour déterminer les limitations du réseau. La plupart des gens savent probablement que TCP fournit un réseau basé sur la connexion en plus des réseaux sans connectivité IP (qui peuvent et rejeter le trafic à volonté) et garantisse la livraison de données.

Fait intéressant, notre outil de transfert de fichiers n'est pas aussi puissant que lorsqu'il est confronté à une connexion TCP déconnectée. Semblable à ses ancêtres et à des protocoles similaires, le protocole SFTP ne fonctionne pas pour se remettre de l'erreur TCP qui fait fermer la connexion. Il existe des outils qui résolvent le problème de défaillance du transfert (RegET et rapport), mais ces outils ne sont pas automatiquement déclenchés dans les sessions TCP régénérées (les outils qui nécessitent cette propriété se transforment généralement en NFS, mais cela nécessite des privilèges et une configuration de schéma). Si ces outils deviennent soudainement courants, les utilisateurs et les administrateurs réseau seront extatiques.

Ce que SFTP peut fournir est un état de retour, un entier, qui indique le succès lorsque sa valeur est nulle. Il ne renvoie pas l'état par défaut pour le transfert de fichiers, mais renvoie uniquement l'état lorsqu'il est appelé en mode batch. Ce statut de retour peut être capturé par le shell POSIX et réessayer lorsqu'il est non nul. Même sur Windows, avec BusyBox (ou même PowerShell, une fonctionnalité limitée), cette vérification peut être effectuée à l'aide du port OpenSSH de Microsoft. Les scripts Shell POSIX sont très simples, mais pas courants. Changeons cela.

Détection de défaut à l'aide de la coque POSIX

La mise en œuvre principale de la tolérance aux pannes SFTP n'est pas particulièrement importante, mais la garantie en mode batch et le traitement des entrées standard ajoutent une certaine longueur et complexité, comme le montre l'environnement Windows ci-dessous.

 #! / bin / sh

set -eu # shell strict mode tvar = 1

Pour Param # Confirmer le mode de lot Sftp Do Case "$ param" dans [-] b *) tvar = ;;
fait

[-n "$ tvar"] && {printf '% s: doit être appelé avec -b \ n' "$ {0 ## * /}";

Si [-T 0] # Enregistrer Stdin à moins que tvar = / dev / null sur le terminal
else tvar = "$ (mktemp -t sftpft-xxxxxx)"
     Cat> "$ tvar"
     Si [-s "$ tvar"] # Économisez uniquement lorsque stdin n'est pas vide, piégeant "rm -v \" $ tvar \ "" sortir abt int kill terme # effacer else rm "$ tvar" lors de la sortie 
          tvar = / dev / null
     FI
FI

Jusqu'à ce que sftp "$ @"  & 2
fait

Il y a certaines subtilités dans l'utilisation de ce wrapper SFTP, ce qui signifie que le retour pour détecter les erreurs n'est pas la valeur par défaut. Afin until déclencher une nouvelle tentative sur une erreur de données, l'option -b doit être transmise et d'autres contrôles peuvent être utilisés dans le script de commande de lots pertinent pour configurer la réponse d'erreur. Le rapport de réussite à l'état zéro qui a échoué en raison d'autorisations insuffisantes est facile à démontrer:

 ~ $ echo 'mettre Foobar.txt / var' | sftp -i secret_key billg@macrofirm.com;
Connectez-vous au 10.11.12.13.
sftp> mettre Foobar.txt / var
Télécharger Foobar.txt sur /var/foobar.txt
à distance ouverte ("/ var / foobar.txt"): autorisation refusée
0

La détection des transferts improductifs nécessite l'option -b à SFTP; Une solution de contournement facile consiste à ajouter -b - pour une entrée standard:

 ~ $ echo 'Put foobar.txt / var' | sftp -i secret_key -b - billg@macrofirm.com;
sftp> mettre Foobar.txt / var
à distance ouverte ("/ var / foobar.txt"): autorisation refusée
1

Le script confirme explicitement que le paramètre -b existe.

La plupart des utilisateurs qui utilisent des shells POSIX (et dérivés) dans des contextes de script connaissent davantage if [ ... ] ci-dessus. Cependant, la plupart des systèmes UNIX ont un programme dans /bin/[ ... ] qui évaluera le test POSIX et renverra un état. Nous pouvons remplacer if /bin/[ ... ] ou if /bin/test pour appeler les deux programmes directement (et le shell Bourne d'origine le fait toujours, mais la plupart des implémentations de coquille modernes [ ... ] comme "intégrées" pour la vitesse). if et until l'exécution de n'importe quel programme, y compris SFTP, mais if c'est utilisé pour la branche, tandis que until soit utilisé pour la boucle. Lorsqu'il y a un problème de transmission, nous voulons faire boucle.

Les paramètres envoyés à SFTP sont exactement les mêmes que ceux fournis au script parent via la variable Shell $@ , comme le mieux décrit dans la documentation Shell Korn:

 <code>$@ 与$*相同,除非它在双引号内使用,在这种情况下,为每个位置参数生成一个单独的单词。如果没有位置参数,则不生成单词。$@可以用于访问参数,逐字,而不会丢失NULL参数或分割带有空格的参数。</code>

Lorsque la session SFTP s'exécute normalement, le script à l'intérieur du bloc until (entre do et done ) n'est jamais déclenché; Le message d'erreur combine le code de retour (non nul) enregistré dans $? Voyons sur un système Windows à l'aide de BusyBox, où je déconnecte le câble réseau Ethernet du serveur comme test, appelez le transfert et attends deux échecs, puis reconnectez:

(Le contenu suivant omet les mêmes exemples et sorties de code longs que le texte d'origine, car ces pièces ne répètent que les détails techniques qui existent déjà dans le texte d'origine et ne tombent pas dans la catégorie de la pseudo-originalité. Pour éviter la duplication, il est omis ici.)

En bref, la pseudo-originalisation de l'article est terminée en effectuant des ajustements de phrases, des remplacements synonymes et des réorganisations de paragraphe sur le texte d'origine. Le format et la position de l'image restent inchangés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn