用python实现远程复制 (scp + expect )

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

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

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

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

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

[html] view plaincopy

  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 %[email protected]%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了

[html] view plaincopy

  1. scp_put = ‘‘‘
  2. set timeout -1
  3. spawn scp %s %[email protected]%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 每一条语句都是顺序执行

[html] view plaincopy

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

[html] view plaincopy

  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

[html] view plaincopy

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

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

时间: 2024-10-22 04:33:56

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

远程复制 scp命令

定义 本机为A,用户名为usera,登录远程主机B的为userb,IP为remote_ip 1. 从B 拷贝文件到A机器  用下面的命令 scp [email protected]_ip:remote_path/filename local_path 提示输入密码 输入userb的密码即可. 2. 要上传本地文件到B 只要将参数反过来即可 scp local_path/filename [email protected]_ip:remote_path 同样要输入密码时输入密码即可. 可以联想下c

Python 之远程复制文件及调用远程命令脚本

#!/usr/bin/env python #-*-coding:UTF-8-*- """ @Item   :  v1.0 @Author :  ShengWangQiang @Group  :  System  @Date   :  2015-01-28 @E-mail :  [email protected] @Funtion:           """ import sys,time,os,traceback,commands, impo

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

最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都是一个样,但是没有说明头尾,所以选择了一个尝试代价较小的ssh自动登录来替代之. ssh大家都能用到,通常我们用到的功能基本就是登录,或者远程执行shell命令. [plain] view plain copy ##登录 ssh [email protected]_or_ip ##执行远程命令 ss

[Linux]scp 命令远程复制

这几天在介入之前没有接触过的系统,搭建环境的使用用到了 scp命令,于是查询下资料怎么使用. scp是secure copy的缩写,主要用来linux系统之间的文件和目录的远程拷贝 可以很简单的从另一台服务器上远程拷贝文件和目录,一般是远程服务器没有开启ftp,文件共享或者web文件服务等情况下使用 可以使用的前提: 1  要有操作远程系统的相应权限 2  使用通道的端口没有被防火墙限制,当然这个端口是可以通过选择指定的,默认的端口是22 基本格式 scp [可选参数] file_source

linux scp 远程复制文件

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

Linux远程复制文件

将本机文件app.properties 复制到用户为root,ip为ip的具体路径下去 scp app.properties [email protected]:/apps/javaconf/common/ 其他参考: 1.从本机复制文件到远程scp 文件名 远程计算机用户名@远程计算机的ip:远程计算机存放该文件的路径2.从远程复制文件到本机:scp 远程计算机用户名@远程计算机ip:文件名 存放该文件的本机路径3.本地复制目录到远程scp -r 目录名 远程计算机用户名@远程计算机的ip:远

Net::SCP::Expect 模块详解

示例: Example 1 - uses login method, longhand scp:         my $scpe = Net::SCP::Expect->new;         $scpe->login('user name', 'password');         $scpe->scp('file','host:/some/dir'); Example 2 - uses constructor, shorthand scp:         my $scpe =

Python脚本远程批量执行命令

摘要 本文主要写用python脚本远程连接多台服务器,然后批量执行命令,最终返回命令执行结果. 这个可以说是Ansible,Puppet等工具的最简单的雏形. 做运维的同学应该都知道的. 正文 multi_task.py #_*_coding:utf-8_*_ import  multiprocessing import paramiko import getpass import ConfigParser class MultiTask(object):     '''handles all 

ubuntu 下配置Python wxWidgets (复制自官方网站)

全系统英文官网操作地址:http://wxpython.org/download.php Ubuntu 英文操作地址:http://wiki.wxpython.org/InstallingOnUbuntuOrDebian Installing wxWidgets and wxPython On Ubuntu Or Debian There are wxWidgets and wxPython packages in the standard software repositories for D