Ftp Expect脚本已运行多年,在使用新的Expect版本时表现异常

Ftp Expect脚本已运行多年,在使用新的Expect版本时表现异常,ftp,expect,matching,Ftp,Expect,Matching,我最近从FreeBSD 4.x服务器迁移到FreeBSD 8.0服务器。我现在使用的是expect-5.43.0_3。我不记得expect的旧版本是什么,也无法快速检查,因为旧系统上的硬盘在完成测试后几分钟内就崩溃了 迁移唷 无论如何,我有一个expect脚本,它创建了一个压缩的tar文件,并每晚通过FTP传输。此脚本已成功运行多年。突然,自从迁移/升级之后,它就不能正常工作了,我盯着它看了好几天,摆弄了好几天都没能修复它。我想确保在继续下一个FTP命令之前,每个FTP命令都已成功完成,因为接下

我最近从FreeBSD 4.x服务器迁移到FreeBSD 8.0服务器。我现在使用的是expect-5.43.0_3。我不记得expect的旧版本是什么,也无法快速检查,因为旧系统上的硬盘在完成测试后几分钟内就崩溃了 迁移唷

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

因此,脚本的这一部分仍然有效:

。。。 下面是对应于 以上:

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

到目前为止,一切都很好!一切都像过去一样运转 六年,但下一行失败,出现ftp意外提示2, 即使它正在寻找的字符串,\n226显然在 对话流

expect \# exp_continue "ftp> " {puts "ftp unexpected prompt 2"; exit 3} timeout {puts "ftp put timeout\n";exit 3} "\n226" 请注意,很明显,在ftp>之前的对话流中有一个\n226,但我始终得到ftp意外提示2。我尝试将其更改为“转移”或“完成”,但仍然有相同的效果。现在,我运行脚本时没有检查是否成功完成,但显然,我对此不满意,而且 这是一个等待发生的意外,因为以下步骤将删除选定的旧文件,如果这些文件未成功传输,我不想执行此操作,而我目前没有此测试


我假设输入流缓冲/处理发生了一些变化,我需要进行更改,以便它在看到ftp>字符串之前看到\n226或传输或完成,但为什么?那么,就这一点而言,是如何做到的呢

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

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

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

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

不要使用复杂的expect脚本,只需使用ncftp包中的ncftpput命令即可。它允许您以类似于scp的方式将文件放到ftp服务器上,并在错误时返回非零。是否在superuser.com上使用exp_internal 1运行它?然后,您可以看到expect看到的输入流。 expect \# exp_continue "ftp> " {puts "ftp unexpected prompt 2"; exit 3} timeout {puts "ftp put timeout\n";exit 3} "\n226"
######
226 Transfer complete.
21689518 bytes sent in 01:15 (280.27 KB/s)
ftp>