&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
残念ながら、sftpは入力ファイル内のすべての要求を順番に実行するだけで、転送が成功したかどうかをテストする仕組みはありません。
コマンドマクロが使用できない場合、代替手段はありますか?gnu_tools製品にはexpectというプログラムが同梱されています。これはコマンド送信、任意の数の異なる応答待ち、出力ストリームの内容に基づく処理実行に使用できます。私はexpectの専門家ではありませんが、図6のスクリプトが導入の助けとなるでしょう。「expectスクリプト」でウェブ検索すれば、私の簡易例をカスタマイズするのに役立つ多くの参考資料が見つかります。
# If we get an end-of-file (eof) it means that the sftp process# この手順は、キー文字列を検索する正規表現の一致処理を行います# 実行されたコマンドから収集された出力において。この場合 # 私は単にエラーの種類を報告しているだけで、他の対応も可能です # 同様に。私も2つのエラーしか確認していません。他にもあります。あなたは # 見つけたものから追加していく。 # proc checkforerrors {buf cmd} { if [正規表現 {.*not found} $buf] { 「$cmd FAILED : not found」と出力する 1を返す } if [regexp {.*Permission denied} $buf] { 「$cmd FAILED : アクセス問題が発生しました」と出力します 1を返す } return 0 タイムアウトを-1に設定し、タイムアウトを無効化します。デフォルトは10秒です。 # そしてほとんどのファイル転送はそれよりも時間がかかる。私は設定しないことに決めた # タイムアウト、変更可能です。 タイムアウトを設定 -1 # start sftp # sftpプロンプトを待機するが、認証プロンプト( # テスト用の便利なディレクトリに変更 # send "put foor" send "get barr" send "quitr" |
expect sftp3.exp間違ったサーバーに接続したか、サーバーが再読み込みされました。このスクリプトを再度実行するには、サーバーキーの検証が必要です。ready 10:41:10 |
expect sftp3.expsftp> get barリモートファイルを統計処理できませんでした: ファイルまたはディレクトリが見つかりません ファイル "/SysAdmin/Noah_Davids/sftp_test/bar" が見つかりません。 sftp> get bar FAILED : not foundready 10:42:11 |
最後に、私のFTPブログで述べたように、FTPは開かれたままのファイルを読み取ることが可能であり、これが原因で不完全なファイルが転送されることがありました。そこで提案したのは、FTPマクロが特定の場所にファイルが出現するのを待機し、その後転送する場合、そのファイルがロック解除されていることを確認すべきだということです。同じ問題はSFTPでも発生し得ますが、解決策は同様です。 ファイルロックチェックをコマンドマクロ(図9)に配置し、ファイルのロックが解除された時点で適切なスクリプトを実行するexpectを呼び出せます。
&label AGAIN |
