我希望能够对我编写的期望脚本有一点了解。
基本上,我们有这个期望脚本来执行 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
在脚本中进行设置以查看更好的调试消息。它可能匹配不正确。
编辑:它也可能是末尾的空格。