最近、FreeBSD 4.x サーバーから FreeBSD 8.0 サーバーに移行しました。現在、expect-5.43.0_3 を使用しています。古いシステムのハード ドライブは、移行が完了してから数分以内にクラッシュしたため、expect の古いバージョンが何であるかを覚えていません。すぐに確認することもできません。(うわー!)
とにかく、圧縮された tar ファイルを作成し、毎晩 FTP 経由で転送するスクリプトを期待しています。このスクリプトは YEARS の間正常に実行されています。突然、移行/アップグレード以降、正常に動作しなくなり、修正することができずに DAYS を見つめていじりました。次のステップに進む前に、各 FTP コマンドが正常に完了したことを確認したいと考えています。次のステップには、リモート サーバー上の選択した古いバージョンのファイルを削除することが含まれているためです。正しく機能していません。
したがって、スクリプトのこの部分は引き続き機能します。
...
スポーン ftp $ftpmode $ftphost タイムアウト {puts "\nftp 接続タイムアウト (暗黙的)\n"; 出口3} "timed out" {puts "\nftp 接続タイムアウト (明示的)\n"; exit 3} 530 {puts "ログイン失敗!"; 出口 3 } "\n230" タイムアウト {puts "\n進行コマンドの前の ftp コマンド プロンプト タイムアウト\n"; exit 8} "ftp> " 「進捗オフ\r」を送信 タイムアウト {puts "\nハッシュ コマンドの前の ftp コマンド プロンプト タイムアウト \n"; 出口 9} "ftp> " 「ハッシュ 32768\r」を送信 expect timeout {puts "\nftp command timeout";exit 5} "ftp> " # 見つかったアーカイブ ファイルごとに ( # 数日間送信できなかった)、送信して削除 foreach アーカイブ [glob -nocomplain ${archivestem}*$archiveext] { send "put $archive\r" "ftp>" を期待 {puts "ftp 予期しないプロンプト 1"; exit 3} timeout {puts "ftp put timeout\n";exit 3} "\n150"
... 上記の実行に対応するダイアログ ストリームは次のとおりです。
230 ユーザー XXXXXXX がログインしました。 リモート システム タイプは UNIX です。 バイナリ モードを使用してファイルを転送します。 ftp>進行状況オフ プログレスバーオフ。 ftp> ハッシュ 32768 ハッシュマーク印字オン (32768 バイト/ハッシュマーク)。 ftp> クルースケジュール-alldump-2010-02-27.tgz を置きます ローカル:crewsched-alldump-2010-02-27.tgz リモート:crewsched- alldump-2010-02-27.tgz 227 パッシブモードに入る (141,224,159,31,30,167) 150 の BINARY モードのデータ接続を開いています。 #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### #################################################### ########## 226 転送が完了しました。 21689518 バイトが 01:15 に送信されました (280.27 KB/秒)
(注 - ハッシュ マークを使用すると、短いタイムアウト値を使用して、スクリプトがハングしているかどうかをすばやく検出できます)
ここまでは順調ですね!過去 6 年間、すべてはまだ機能していますが、次の行は「ftp unexpected prompt 2」で失敗します。探している文字列「\n226」がダイアログ ストリームにあるにもかかわらず、
expect \# exp_continue "ftp> " {puts "ftp unexpected prompt 2"; exit 3} timeout {puts "ftp put timeout\n";exit 3} "\n226"
非常に明確に、「ftp>」の前にダイアログ ストリームに「\n226」があったことに注意してください。「転送」または「完了」に変更してみましたが、それでも同じ効果がありました。現在、正常に完了したことを確認せずにスクリプトを実行していますが、明らかに満足していません。次の手順で選択した古いファイルが削除されるため、事故が発生するのを待っています。これは望ましくありません。これらのファイルが正常に転送されなかった場合、現在テストしていません。
入力ストリームのバッファリング/処理で何かが変更され、「ftp>」文字列を「見る」前に「\n226」または「転送」または「完了」を「見る」ように変更する必要があると思います、 しかし、なぜ?さらに言えば、どのように?:)