&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 [regexp {.*not found} $buf] {. puts "$cmd FAILED : not foundnnn" 復帰1 } if [regexp {.*Permission denied} $buf] {. puts "$cmd FAILED : access problemsnnn" 復帰1 } 還る }# タイムアウトがないように-1に設定します。デフォルトは10秒です。 # と、ほとんどのファイル転送にはそれよりも時間がかかります。を設定しないことにしました。 # タイムアウトは変更可能です セットタイムアウト-1 # start sftp # sftpのプロンプトを待ちますが、認証プロンプトが表示されたら、最後に テストに適したディレクトリに変更します。 # call check for errors passing it all collected characters up the send "put foor" send "get barr" 辞令を出す |
expect sftp3.exp 間違ったサーバーに接続してしまったのか、サーバーがリロードされてしまいました。このスクリプトを再度実行するには、サーバーキーを検証する必要があります。 |
expect sftp3.exp sftp> 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 |