私が書いたexpectスクリプトについて少し洞察を得たいと思っていました。
基本的に、このexpectスクリプトはsftpアップロードを実行しますが、キー認証はオプションではありません。ベンダーがサポートする方法はsftpのみであるため、これが必要です。
スクリプトの目的で、タイムアウトをキャッチし、エラーコードをログに記録できるようにしたい。
する必要がある:
これが私がこれまでに持っているものです:
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(キーが変更された)として返され、キーが実際に変更されたときに「はい」を送信しませんでした。
繰り返しになりますが、どんな助けでも大歓迎です。
タイムアウトの場合:
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
を設定して、デバッグメッセージを改善してください。正しく一致していない可能性があります。
編集:それは最後のスペースでもありえます。