【问题标题】:Expect script, working for years, behaves unexpectedly with new Expect version工作多年的 Expect 脚本在新的 Expect 版本中表现异常
【发布时间】:2011-01-23 05:24:27
【问题描述】:

我最近从 FreeBSD 4.x 服务器迁移到 FreeBSD 8.0 服务器。我现在正在使用 expect-5.43.0_3。不记得expect是什么老版本了,也没法快速查,因为老系统上的硬盘在完成后几分钟就崩溃了 移民! (哇!)

无论如何,我有一个期望脚本,它创建一个压缩的 tar 文件并每晚通过 FTP 传输它。该脚本已成功运行了 YEARS。突然,自从迁移/升级以来,它就无法正常工作,我盯着它看了好几天,却无法修复它。我想确保每个 FTP 命令都已成功完成,然后再继续执行下一个命令,因为接下来的步骤包括删除远程服务器上选定的旧版本文件,如果传输是,我不想执行删除操作不能正常工作。

所以 - 这部分脚本仍然有效:

...

生成 ftp $ftpmode $ftphost 期望超时 {puts "\nftp 连接超时(隐式)\n";出口 3} "超时" {puts "\nftp 连接超时(显式)\n"; exit 3} 530 {puts "登录失败!";退出 3 } "\n230" 期望超时 {将“\nftp 命令提示超时放在进度命令之前\n”;退出 8} "ftp> " 发送“进度关闭\r” 期望超时 {将“\nftp 命令提示符超时放在散列命令 \n 之前”;退出 9} "ftp> " 发送“哈希 32768\r” 期望超时 {puts "\nftp 命令超时";exit 5} "ftp> " # 对于我们找到的每个存档文件(如果我们已经 # 好几天不能发送了),发送删除 foreach 存档 [glob -nocomplain ${archivestem}*$archiveext] { 发送“put $archive\r” 期望 "ftp> " {puts "ftp 意外提示 1"; exit 3} timeout {puts "ftp put timeout\n";exit 3} "\n150"

... 这是对应于执行的对话流 以上:

230 用户 XXXXXXX 已登录。 远程系统类型是 UNIX。 使用二进制模式传输文件。 ftp>进度关闭 进度条关闭。 ftp> 哈希 32768 散列标记打印(32768 字节/散列标记)。 ftp> 放船员sched-alldump-2010-02-27.tgz 本地:crewsched-alldump-2010-02-27.tgz 远程:crewsched- alldump-2010-02-27.tgz 227进入被动模式(141,224,159,31,30,167) 150 打开 BINARY 模式数据连接。 ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ################################################# ########### 226 传输完成。 01:15 发送 21689518 字节 (280.27 KB/s)

(注意 - 哈希标记允许我使用较低的超时值并快速 检测脚本是否挂起)

到目前为止,一切都很好!一切仍然按照上次的方式工作 六年,但下一行因“ftp unexpected prompt 2”而失败, 即使它正在寻找的字符串,“\n226”在 对话流

期望 \# exp_continue "ftp> " {puts "ftp 意外提示 2";退出 3} 超时 {puts "ftp put timeout\n";exit 3} "\n226"

请注意,在“ftp>”之前的对话流中很明显有一个“\n226”,但我一直得到“ftp unexpected prompt 2”。我尝试将其更改为“转移”或“完成”,但它仍然具有相同的效果。现在,我正在运行脚本而没有检查是否成功完成,但很明显,我对此并不满意,并且 这是一个等待发生的意外,因为以下步骤会删除选定的旧文件,如果这些文件没有成功传输,我不想这样做,我目前没有测试。

我认为输入流缓冲/处理发生了一些变化,我需要对其进行更改,以便它在“看到”“ftp”之前“看到”“\n226”或“传输”或“完成” > " 字符串,但是为什么呢?而且,就此而言,如何? :)

【问题讨论】:

  • 与其使用复杂的期望脚本,不如使用 ncftp 包中的 ncftpput 命令。它允许您以与 scp 类似的方式将文件放到 ftp 服务器上,并在出错时返回非零值。
  • 属于 superuser.com
  • 你用exp_internal 1运行它了吗?然后,您可以看到预期的输入流。

标签: ftp expect matching


【解决方案1】:

这可能是一个缓冲问题,更改期望语句中项目的顺序可能会有所帮助。

请记住,默认情况下,您指定的是“glob”模式,并且这些模式正在与 Expect 内部的缓冲区数据进行比较,而不是严格逐个字符地进行比较。假设缓冲区恰好包含输入流的这个片段:

######
226 Transfer complete.
21689518 bytes sent in 01:15 (280.27 KB/s)
ftp>

这匹配 glob 模式“ftp>”和模式“\n226”,因为前者首先出现在期望语句中,所以将执行操作。

【讨论】:

    猜你喜欢
    • 2022-10-19
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多