1

最近、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」または「転送」または「完了」を「見る」ように変更する必要があると思います、 しかし、なぜ?さらに言えば、どのように?:)

4

1 に答える 1

0

これはバッファリングの問題である可能性があり、expect ステートメント内の項目の順序を変更すると役立つ場合があります。

デフォルトでは、「グロブ」パターンを指定しており、これらのパターンは厳密に文字単位ではなく、Expect の内部でデータのバッファーと比較されることに注意してください。バッファに、たまたま入力ストリームの次のフラグメントが含まれていたとします。

######
226 Transfer complete.
21689518 bytes sent in 01:15 (280.27 KB/s)
ftp>

これは、glob パターン "ftp>" とパターン "\n226" の両方に一致し、前者が expect ステートメントで最初に現れるため、アクションが実行されます。

于 2010-04-01T10:45:22.750 に答える