预期脚本、超时和错误检查

预期脚本、超时和错误检查

我希望能够对我编写的期望脚本有一点了解。

基本上,我们有这个期望脚本来执行 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

我相信代码正在运行直至超时,下面是来自预期会话的日志:

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

似乎“退出”被发送了两次?我想这是有道理的,因为它看到 100% 并在提示准备好之前立即发送“退出”。

我应该做哪些改变才能获得预期的结果?

任何帮助将非常感激。

另一方面,我想扩展这个预期脚本,或者创建另一个脚本来检测 DES 密钥何时发生变化,接受它(发送是),然后继续。

不过,我想知道什么时候会发生这种情况,无论是通过错误代码,还是将某些内容写入日志文件......

我尝试了以下操作但没有按预期工作:

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

对于超时:

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 "sftp> "

DES 密钥更改期望可能需要转义括号。请尝试exp_internal 1在脚本中进行设置以查看更好的调试消息。它可能匹配不正确。

编辑:它也可能是末尾的空格。

相关内容