我希望能够对我写的期望脚本有一点洞察。
基本上我们有这个期望的脚本执行sftp上传,密钥authentication不是一个选项,sftp是我们的供应商支持的唯一方法,因此需要这个。
我希望能够捕获超时并logging错误代码的脚本的目的。
我需要:
这是我到目前为止:
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
看起来“退出”发送两次? 我认为这是有意义的B / C它看到100%,并立即发出“退出”提示准备就绪之前。
我应该做些什么才能获得预期的结果?
任何帮助将非常感激。
在另一个说明中,我想扩展这个期望的脚本,或者创build另一个检测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(密钥已更改)返回,并且在密钥实际发生更改时不发送“是”。
再次,任何帮助将不胜感激。
对于超时:
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以查看更好的debugging消息。 它可能不正确匹配。
编辑:它可能是最后的空间。