1

我最近从 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)

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

到目前为止,一切都很好!在过去的 6 年里,一切仍然正常工作,但下一行失败并显示“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”或“传输”或“完成” , 但为什么?而且,就此而言,如何?:)

4

1 回答 1

0

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

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

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

这与 glob 模式 "ftp>" 和模式 "\n226" 都匹配,并且由于前者首先出现在期望语句中,因此将执行操作。

于 2010-04-01T10:45:22.750 回答