用python实现远程复制 (scp + expect )
来源:互联网 发布:ar软件下载苹果 编辑:程序博客网 时间:2024/06/03 18:01
scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置.
用 sshpass 可能在命令输入 password, 但 需要用 “sudo apt-get install sshpass” 安装
如果不想用上面两种方法,可以用 expect 编写脚本可以帮助我们自动交互
虽然 python 也提供 pexpect 模块,但既然 expect 很简单,为何不直接用 os.system() 去执行呢?
下面是我编写的类,实现了远程复制
- class RemoteShell:
- def __init__(self, host, user, pwd):
- self.host = host
- self.user = user
- self.pwd = pwd
- def put(self, local_path, remote_path):
- scp_put = '''
- spawn scp %s %s@%s:%s
- expect "(yes/no)?" {
- send "yes\r"
- expect "password:"
- send "%s\r"
- } "password:" {send "%s\r"}
- expect eof
- exit'''
- os.system("echo '%s' > scp_put.cmd" % (scp_put % (os.path.expanduser(local_path), self.user, self.host, remote_path, self.pwd, self.pwd)))
- os.system('expect scp_put.cmd')
- os.system('rm scp_put.cmd')
但发现每次文件都没有复制完,我想看expect 究竟做了什么事情,还好 expect 提供 -d 参数给出更多的信息。
最后发现是被复制文件太大,expect 超时退出了
在脚本前加入 “set timeout -1" 就OK了
- scp_put = '''
- set timeout -1
- spawn scp %s %s@%s:%s
- expect "(yes/no)?" {
- send "yes\r"
- expect "password:"
- send "%s\r"
- } "password:" {send "%s\r"}
- expect eof
- exit'''
总结
1) expect 每一条语句都是顺序执行
2) 每当 spawn 的程序有输出的时候的,expect都会去匹配, 如果匹配不上,就等下次有输出,再次执行当前的 expect, 直到超时 (我用 expect -d 去追踪,得到的结论);当然可以设置没有超时 "set timeout -1"
3) 如果 expect 退出, 被它 spawn 的程序会被 kill 掉
4) spawn 结束的时候,它向标准输出的的 eof 会被 expect 检测到,正好作为 expect 脚本退出的时机。
对于 scp 可以先检测 100%,因为 scp 会输出复制进度,再检测 eof
- expect "100%%"
- expect eof
5) expect 是部分匹配,所以不要担心自己不知道程序的完整输出
版权声明:本文为博主原创文章,未经博主允许不得转载。
0 0
- 用python实现远程复制 (scp + expect )
- 用python实现远程复制 (scp + expect )
- scp远程拷贝expect实现SHELL
- expect实现远程交互scp,ssh
- 使用expect脚本实现scp远程传输
- shell脚本中用expect实现远程scp文件
- 通过在shell脚本中用expect实现远程scp文件
- scp(远程文件复制)指令详解
- linux远程复制SCP
- scp远程复制文件
- scp 命令远程复制
- scp 远程复制文件
- expect安装及远程scp拷贝
- Linux 使用expect工具和scp命令实现自动复制传输文件
- ssh,expect脚本实现远程登录,拷贝命令scp,rsync服务器的搭建
- Linux 远程目录复制SCP
- scp远程无密码复制
- 远程复制文件scp命令
- 状态栏提示控件的实现原理(转自http://www.cnblogs.com/smileEvday/archive/2013/05/30/statusBarTips.html)
- PHP curl post提交表单
- div li隔行变色 鼠标悬浮高亮显示 jquery控制css样式
- css 引入新字体
- 安全删除MySQL二进制日志的3种方法
- 用python实现远程复制 (scp + expect )
- 【笔记】Spring MVC学习指南(十)国际化
- maxMascots
- ios状态栏(转自http://www.molotang.com/articles/1609.html)
- sea.js基础学习
- Android面试题目汇总
- 【代码片段】汉诺塔python
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
- URAL 1203 Scientific Conference (贪心 + 优化)