&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
遗憾的是,sftp只会陆续执行输入文件中的所有请求,没有任何机制来测试传输是否成功。
既然不能使用命令宏,有没有其他的选择?gnu_tools产品中提供了一个名为expect的程序。它可以用来发送命令,等待任何数量的不同的响应,并根据它在输出流中看到的东西做一些事情。我不是 expect 专家,但图 6 中的脚本可以帮助你开始使用。如果你在网上搜索"期望脚本",你会发现很多参考资料,可以帮助你定制我的简单例子。
# If we get an end-of-file (eof) it means that the sftp process # 这个过程进行正则表达式匹配,寻找关键字符串在从执行的命令中收集的输出中#。在这种情况下 # 我只是报告错误类型,但也可以做其他事情 #也是。我也只检查了2个错误。还有其他的。你会有 # #添加他们,因为你发现他们。 # proc checkforerrors {buf cmd} { 如果 [regexp {.*not found} $buf] { 把"$cmd FAILED : not foundnnn" 返回1 } 如果 [regexp {.*Permission denied} $buf] { 把"$cmd FAILED : 访问问题nnn" 返回1 } 回0 }# 将超时设置为-1,所以没有超时。默认为10秒 # 而大多数文件传输都需要更长的时间。我决定不设置 #超时,你可以改变它。 设置超时-1 # 启动 sftp # 等待sftp提示,但如果我们得到一个认证提示,以 # 换到一个方便的目录进行测试 # 调用检查错误的方法,将所有收集到的字符传上去。 发送 "把门"。 送出 "获得巴尔"。 送"辞行" |
expect sftp3.exp 我们连接到了错误的服务器,或者服务器已经被重新加载。在这个脚本再次运行之前,必须验证服务器密钥。 |
expect sftp3.exp sftp> 获取酒吧无法统计远程文件。没有这样的文件或目录 未找到文件"/SysAdmin/Noah_Davids/sftp_test/bar"。 sftp> get bar FAILED : not foundready 10:42:11 |
最后,我在FTP博客中提到,FTP能够读取还在打开的文件,这有时会导致传输的文件不完整,我建议,如果FTP宏等待文件出现在某个位置,然后再传输,那么宏应该检查是否已经锁定。SFTP也会出现同样的问题,解决方法也是一样的。可以将文件锁检查放在命令宏中(图9),然后当文件不再锁定时,用相应的脚本调用期望。
&label AGAIN |