标签:
scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置.
用 sshpass 可能在命令输入 password, 但 需要用 “sudo apt-get install sshpass” 安装
如果不想用上面两种方法,可以用 expect 编写脚本可以帮助我们自动交互
虽然 python 也提供 pexpect 模块,但既然 expect 很简单,为何不直接用 os.system() 去执行呢?
下面是我编写的类,实现了远程复制
但发现每次文件都没有复制完,我想看expect 究竟做了什么事情,还好 expect 提供 -d 参数给出更多的信息。
最后发现是被复制文件太大,expect 超时退出了
在脚本前加入 “set timeout -1" 就OK了
总结
1) expect 每一条语句都是顺序执行
因为scp 可能先返回 (yes/no)? 再 返回 password:, 也可能直接返回password:, 考虑顺序关系,上面语句的层次关系其实如下:
2) 每当 spawn 的程序有输出的时候的,expect都会去匹配, 如果匹配不上,就等下次有输出,再次执行当前的 expect, 直到超时 (我用 expect -d 去追踪,得到的结论);当然可以设置没有超时 "set timeout -1"
3) 如果 expect 退出, 被它 spawn 的程序会被 kill 掉
4) spawn 结束的时候,它向标准输出的的 eof 会被 expect 检测到,正好作为 expect 脚本退出的时机。
对于 scp 可以先检测 100%,因为 scp 会输出复制进度,再检测 eof
5) expect 是部分匹配,所以不要担心自己不知道程序的完整输出
标签:
原文地址:http://www.cnblogs.com/hushaojun/p/4903287.html