scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置.

用 sshpass 可能在命令输入 password, 但 需要用 “sudo apt-get install sshpass” 安装

如果不想用上面两种方法,可以用 expect 编写脚本可以帮助我们自动交互

虽然 python 也提供 pexpect  模块,但既然 expect 很简单,为何不直接用 os.system() 去执行呢?

下面是我编写的类,实现了远程复制

  1. class RemoteShell:
  2. def __init__(self, host, user, pwd):
  3. self.host = host
  4. self.user  = user
  5. self.pwd  = pwd
  6. def put(self, local_path, remote_path):
  7. scp_put = '''
  8. spawn scp %s %s@%s:%s
  9. expect "(yes/no)?" {
  10. send "yes\r"
  11. expect "password:"
  12. send "%s\r"
  13. } "password:" {send "%s\r"}
  14. expect eof
  15. exit'''
  16. os.system("echo '%s' > scp_put.cmd" % (scp_put % (os.path.expanduser(local_path), self.user, self.host, remote_path, self.pwd, self.pwd)))
  17. os.system('expect scp_put.cmd')
  18. os.system('rm scp_put.cmd')

但发现每次文件都没有复制完,我想看expect 究竟做了什么事情,还好 expect 提供 -d 参数给出更多的信息。

最后发现是被复制文件太大,expect 超时退出了

在脚本前加入 “set timeout -1" 就OK了

  1. scp_put = '''
  2. set timeout -1
  3. spawn scp %s %s@%s:%s
  4. expect "(yes/no)?" {
  5. send "yes\r"
  6. expect "password:"
  7. send "%s\r"
  8. } "password:" {send "%s\r"}
  9. expect eof
  10. exit'''

总结

1) expect 每一条语句都是顺序执行

因为scp 可能先返回 (yes/no)? 再 返回 password:, 也可能直接返回password:, 考虑顺序关系,上面语句的层次关系其实如下:

  1. expect "(yes/no)?" {   send "yes\r"
  2. expect "password:"
  3. send "%s\r"
  4. }
  5. "password:" {send "%s\r"}

2) 每当 spawn 的程序有输出的时候的,expect都会去匹配, 如果匹配不上,就等下次有输出,再次执行当前的 expect, 直到超时 (我用 expect -d 去追踪,得到的结论);当然可以设置没有超时 "set timeout -1"

3) 如果  expect 退出, 被它 spawn 的程序会被 kill 掉

4) spawn 结束的时候,它向标准输出的的 eof 会被 expect 检测到,正好作为 expect 脚本退出的时机。

对于 scp 可以先检测 100%,因为 scp 会输出复制进度,再检测 eof

  1. expect "100%%"
  2. expect eof

5) expect 是部分匹配,所以不要担心自己不知道程序的完整输出

用python实现远程复制 (scp + expect )的更多相关文章

  1. linux 远程复制 scp

    把本地/home/crawler/warning/python/alarmRun.sh 复制到67cralwer用户/home/crawler/warning/python/ 下面 scp -r /h ...

  2. 远程复制 scp命令

    定义 本机为A,用户名为usera,登录远程主机B的为userb,IP为remote_ip 1. 从B 拷贝文件到A机器  用下面的命令 scp userb@remote_ip:remote_path ...

  3. ssh,公钥和私钥,远程复制

    ssh,公钥和私钥,远程复制 1.openssh 是一个提供远程访问控制的软件 2.ssh 远程主机用户@远程主机ip地址 ssh root@172.25.254.1 The authenticity ...

  4. linux scp 远程复制文件

    1.从本机复制文件到远程scp 文件名 远程计算机用户名@远程计算机的ip:远程计算机存放该文件的路径2.从远程复制文件到本机:scp 远程计算机用户名@远程计算机ip:文件名 存放该文件的本机路径3 ...

  5. linux scp命令参数及用法详解--linux远程复制拷贝命令使用实例【转】

    转自:http://blog.csdn.net/jiangkai_nju/article/details/7338177 一般情况,本地网络跟远程网络进行数据交抱,或者数据迁移,常用的有三种方法,一是 ...

  6. [Linux]scp 命令远程复制

    这些天来干预系统之前没有接触,建立使用用途良好的发展环境 scp命令,那么如何使用查询以下信息. scp是secure copy的缩写.主要用来linux系统之间的文件和文件夹的远程拷贝 能够非常ea ...

  7. scp命令:远程复制粘贴文件

    文章链接:https://www.cnblogs.com/webnote/p/5877920.html scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有 ...

  8. scp命令:服务器间远程复制代码

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  9. linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录

    最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都 ...

随机推荐

  1. [ionic开源项目教程] - 第14讲 ionic解决跨域问题

    [ionic开源项目教程] 第14讲 使用jsonp解决跨域问题 相信很多朋友在开发中都会遇到以下这个问题. No 'Access-Control-Allow-Origin' header is pr ...

  2. BZOJ 1103 大都市

    dfs序+BIT. #include<iostream> #include<cstdio> #include<cstring> #include<algori ...

  3. hihoCoder #1195 高斯消元·一

    题意:便利店老板为了促销,推出了组合包的形式,将不同数量的各类商品打包成一个组合.比如2袋薯片,1听可乐的组合只要5元,而1袋薯片,2听可乐的组合只要4元.通过询问老板知道:一共有N种不同的商品和M种 ...

  4. 学习java之HashMap和TreeMap

    HashMap和TreeMap是Map接口的两种实现,ArrayDeque和LinkedList是Queue接口的两种实现方式.下面的代码是我今天学习这四个数据结构之后写的.还是不熟悉,TreeMap ...

  5. csu 1326 The contest

    裸的   并查集  +  分组背包: #include<iostream> #include<cstring> #include<algorithm> #inclu ...

  6. 微信 ua

    Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, l ...

  7. Java中SynchronizedMap与ConcurrentHashMap的对比

    如何使用 概述 ConcurrentHashMap: 线程安全: 其将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都 ...

  8. 身份证上的X到底代表什么?

    生活中,无论你是坐火车,还是办理各种手续,都需要用到身份证,它现在已经俨然成为我们生活的非常重要的一部分,但是关于身份证本身,你了解多少呢? 有人会说了,为什么我的身份证上写的有效时间是10年,而一些 ...

  9. 【调试】DLL EXE 调试技巧

    0.随便说点 最近因为一些原因一直都没有更新博客,从今天开始要逐渐恢复了,也是对自己的鞭策. 1.本文目标 本文要说在有DLL 和 EXE源码的情况下调试DLL 和 EXE, 工具是VC++2010, ...

  10. Linux操作系统中,.zip、.tar、.tar.gz、.tar.bz2、.tar.xz、.jar、.7z等格式的压缩与解压

    zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...