ホームページ >システムチュートリアル >Linux >フォールトトレラントSFTPスクリプト - 再試行失敗した転送は自動的に行われました
導入
最新のネットワークアーキテクチャは、信頼性の低いトランスミッションメディアに基づいて構築されています。ルーティングデバイスは、転送されたデータを自由に破棄、破損、再注文、またはコピーできます。 TCP/IPプロトコルスタックのIPレイヤーは、データの精度を保証できないことを理解しています。 IPネットワークは、100%信頼できると主張できません。
TCPレイヤーは、IPレイヤーの上のガーディアンとして機能し、生成するデータが正しいことを確認します。これはさまざまな手法によって達成され、ネットワークの制限を決定するためにデータが意図的に失われることがあります。ほとんどの人は、おそらくTCPがIP接続のないネットワーク(自由にトラフィックを破棄することができる)上の接続ベースのネットワークを提供し、データ配信を保証することを知っています。
興味深いことに、ファイル転送ツールは、切断されたTCP接続に直面している場合ほど強力ではありません。その祖先や同様のプロトコルと同様に、SFTPプロトコルは、接続が閉じられるTCPエラーから回復するために機能しません。転送障害の問題を解決するツール(Reget and Report)がありますが、これらのツールは再生されたTCPセッションでは自動的にトリガーされていません(通常、このプロパティを必要とするツールは通常NFSに変わりますが、これには特権とスキーマ構成が必要です)。そのようなツールが突然一般的になった場合、ユーザーとネットワーク管理者はecとしています。
SFTPが提供できるのは、その価値がゼロの場合に成功を示す整数であるリターン状態です。ファイル転送の場合はデフォルトでステータスを返すことはありませんが、バッチモードで呼び出された場合のみステータスを返します。このリターンステータスは、POSIXシェルによってキャプチャされ、ゼロ以外の場合は再試行できます。 Windowsでも、Busybox(またはPowerShell、限られた機能)がある場合でも、このチェックはMicrosoftのOpenSSHポートを使用して実行できます。 Posixシェルスクリプトは非常に単純ですが、一般的ではありません。それを変えましょう。
POSIXシェルを使用した障害検出
SFTPフォールトトレランスのコア実装はそれほど大きくはありませんが、以下のWindows環境に示すように、バッチモード保証と標準入力処理は長さと複雑さを追加します。
#!/bin/sh set -eu#shell strict mode tvar = 1 PARAM#SFTPバッチモードを確認します 終わり [-n "$ tvar"] && {printf '%s:{0 ##*/} " [-t 0]#ターミナルでtvar =/dev/nullをしない限り、stdinを保存します else tvar = "$(mktemp -t sftpft -xxxxxx)" cat> "$ tvar" [-s "$ tvar"]#stdinが空でない場合にのみ保存する場合、trap "rm -v \" $ tvar \ "" exit abrt int kill#erase rm "$ tvar" tvar =/dev/null fi fi sftp "$@" &2 終わり
このSFTPラッパーの使用にはいくつかの微妙さがあります。つまり、エラーを検出するためのリターンはデフォルトではありません。データエラーで再試行をトリガーするuntil
には、 -b
オプションを渡す必要があり、関連するバッチコマンドスクリプトで他のコントロールを使用してエラー応答を構成できます。許可が不十分であるために失敗したゼロ状態の成功レポートは、次のことを簡単に実証できます。
〜$ echo 'foobar.txt /var' | 10.11.12.13に接続します。 sftp> put foobar.txt /var foobar.txtを/var/foobar.txtにアップロードします リモートオープン( "/var/foobar.txt"):許可が拒否されました 0
非生産的な転送の検出には、SFTPの-b
オプションが必要です。簡単な回避策は、標準入力のために-b
を追加することです。
〜$ echo 'foobar.txt /var' |。 sftp> put foobar.txt /var リモートオープン( "/var/foobar.txt"):許可が拒否されました 1
スクリプトは、 -b
パラメーターが存在することを明示的に確認します。
スクリプトコンテキストでPOSIX(および派生)シェルを使用するほとんどのユーザーは、上記のif [ ... ]
条件構造によりよく精通しています。ただし、ほとんどのUNIXシステムには/bin/[ ... ]
にプログラムがあり、POSIX test
を評価し、状態を返します。 if /bin/[ ... ]
またはif /bin/test
場合、両方のプログラムを直接呼び出すことができます(そして、元のBourneシェルは常にこれを行いますが、ほとんどの最新のシェルの実装[ ... ]
「速度のために「組み込み」として)を行います)。 SFTPを含むプログラムを実行できますが、分岐に使用されるif
は、ループに使用されるuntil
until
if
。伝送の問題がある場合は、ループしたいと考えています。
SFTPに送信されたパラメーターは、Korn Shellドキュメントで最もよく説明されているように、 $@
shell変数を介して親スクリプトに提供されたパラメーターとまったく同じです。
<code>$@ 与$*相同,除非它在双引号内使用,在这种情况下,为每个位置参数生成一个单独的单词。如果没有位置参数,则不生成单词。$@可以用于访问参数,逐字,而不会丢失NULL参数或分割带有空格的参数。</code>
SFTPセッションが正常に実行されている場合、[ do
とdone
のuntil
)内のスクリプトは、最初のTCP接続が故障した場合にのみ呼び出されます。エラーメッセージは、コマンドラインの最後のパラメーターと$?
に保存された(ゼロ以外の)戻りコードを組み合わせます。 Busyboxを使用してWindowsシステムでデモを行います。ここで、サーバーのイーサネットネットワークケーブルをテストとして切断し、転送を呼び出して2つの障害を待ち、次に再接続します。
(以下のコンテンツは、元のテキストと同じ長いコードの例と出力を省略します。これらの部分は、元のテキストに既に存在し、擬似オリジナリティのカテゴリに分類されない技術的な詳細を繰り返すためです。複製を避けるために、ここでは省略されています。)
要するに、記事の擬似オリジナル化は、元のテキストで文の調整、同義語の置換、段落の再編成を実行することで完了します。 画像形式と位置は変更されていません。
以上がフォールトトレラントSFTPスクリプト - 再試行失敗した転送は自動的に行われましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。