我最近从 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”或“传输”或“完成” , 但为什么?而且,就此而言,如何?:)