web-dev-qa-db-ja.com

スクリプト、タイムアウト、エラーチェックを期待する

私が書いたexpectスクリプトについて少し洞察を得たいと思っていました。

基本的に、このexpectスクリプトはsftpアップロードを実行しますが、キー認証はオプションではありません。ベンダーがサポートする方法はsftpのみであるため、これが必要です。

スクリプトの目的で、タイムアウトをキャッチし、エラーコードをログに記録できるようにしたい。

する必要がある:

  • Sftpサイトにログインします
  • 転送を開始します
  • アップロードが100%に達したことを検出します
  • アップロードが特定の時間内に100%に達しない場合は、スクリプトの目的でエラーコードをログに記録したいと思います。

これが私がこれまでに持っているものです:

set timeout 10
spawn sftp [email protected]
match_max 100000
expect "password: "
send -- "PASSWORD\n"
expect "sftp> "
send -- "lcd /data/upload\n"
expect "sftp> "
send -- "put file_yyyymmdd\n"
expect "*100%*" {send "quit\n" } \
timeout { exit 2 }
expect "sftp> "
send -- "quit\n"
expect eof

コードはタイムアウトまで機能していると思います。以下は、expectセッションからのログです。

spawn sftp [email protected]
[email protected]'s password: 
Connected to xxx.xxx.xxx.xxx.
sftp> lcd /data/upload/
sftp> put file_yyyymmdd
Uploading file_yyyymmdd to /home/user/file_yyyymmdd
file_yyyymmdd                                 0%    0     0.0KB/s   --:-- ETA
file_yyyymmdd                               100% 5835     5.7KB/s   00:00    
quit
sftp> quit

「終了」が2回送信されたようです。私が推測するのは、100%を認識し、プロンプトの準備ができる前にすぐに「終了」を送信することです。

期待どおりの結果を得るには、どのような変更を加える必要がありますか?

どんな助けでも大歓迎です。

別の注意点として、このexpectスクリプトを拡張するか、DESキーが変更されたことを検出する別のスクリプトを作成し、それを受け入れ(yesを送信)、続行します。

ただし、エラーコードを使用するか、ログファイルに何かを書き込むことで、これがいつ発生するかを知りたいのですが...

次のことを試しましたが、期待どおりに機能しません。

set timeout 10
spawn sftp [email protected]
match_max 100000
expect "Are you sure you want to continue connecting (yes/no)? " {send "yes\r" } \\
timeout { exit 0 }
sleep 2
exit 3
expect eof

終了コードを使用してキーを更新する必要があるかどうかを判断することを考えましたが、常に終了コード3(キーが変更された)として返され、キーが実際に変更されたときに「はい」を送信しませんでした。

繰り返しになりますが、どんな助けでも大歓迎です。

1
Ty Haller

タイムアウトの場合:

expect "*100%*" {send "quit\n" } \
timeout { exit 2 }
expect "sftp> "
send -- "quit\n"
expect eof

に変更する必要があります(わかりやすくするためにフォーマットも異なります)

expect {
  "*100%*" { } 
  timeout { exit 2 }
}
expect "sftp> "
send -- "quit\n"
expect eof

"*100%*" { }セクションは、expectステートメントを終了して次の行に移動するように指示します。

expect "sftp> "

DESキーの変更は、括弧をエスケープする必要がある場合があります。スクリプトでexp_internal 1を設定して、デバッグメッセージを改善してください。正しく一致していない可能性があります。

編集:それは最後のスペースでもありえます。

3
resmon6