Win7下Python2.7环境安装paramiko模块
Win7下Python2.7环境安装paramiko模块,有需要的朋友可以参考下
近段时间用Python写一个小东西,每次修改代码后要手工上传到服务器,觉得很麻烦,虽然有WinSCP,找了一下资料,发现paramiko可以实现自动上传文件的功能,可惜的是,折腾了半天,在Python3.3下没有成功,最后退而求其次安装了2.7才弄好,记录如下:
1.下载安装Windows版本的Python2.7,我默认装在C:\Python27
2.下载PyCrypto2.6 for Python 2.7 64bit
地址为http://www.voidspace.org.uk/python/modules.shtml#pycrypto
以管理员权限执行安装程序,一路Next即可
3.下载安装ecdsa-0.10.tar.gz,地址 https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.10.tar.gz 解压缩
进入安装目录,执行 C:\Python27\python setup.py install
4.下载paramiko压缩包
地址:https://pypi.python.org/packages/source/p/paramiko/paramiko-1.12.1.tar.gz
解压缩后从cmd进入解压缩目录,执行命令
C:\Python27\python setup.sh install
5.确认安装成功
在cmd中执行C:\Python27\python进入python环境
输入import paramiko无错误提示则表示安装成功
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接了,下面我们就来给各位一起验证一下python模块paramiko与ssh安装与使用示例吧。
一、paramiko模块的安装
paramiko模块依赖PyCrypto模块,而PyCrypto需要GCC库编译,不过一般发行版的源里带有该模块。这里以centos6为例,直接借助以下命令可以直接完成安装:
代码如下 | 复制代码 |
# yum install gcc python-crypto python-paramiko python-devel -y |
windows版下可以安装windows版的GCC(MinGW),然后编辑安装pycrypto和paramiko ,下载安成后,直接运行python.exe setup.pybuild 和 python.exe setup.py install 就可以了。
二、paramiko的连接
使用paramiko模块有两种连接方式,一种是通过paramiko.SSHClient()函数,另外一种是通过paramiko.Transport()函数。
方法一:
代码如下 | 复制代码 |
import paramiko |
上面的第二行代码的作用是允许连接不在know_hosts文件中的主机。
方法二:
代码如下 | 复制代码 |
import paramiko |
如果连接远程主机需要提供密钥,上面第二行代码可改成:
代码如下 | 复制代码 |
t.connect(username = "用户名", password = "口令", hostkey="密钥") |
三、paramiko ssh连接
以下是一个简单的通过paramiko模块定义的ssh连接并执行命令的函数,如下:
代码如下 | 复制代码 |
#!/usr/bin/python |
其中第四行的日志部分,是记录ssh连接交互时的一些信息,可以看做是类似于debug的输出,一般情况下不需要开启。
stdin.write部分是用于交互情况下,通过该命令可以执行交互。注意这里可能会引起歧义,这里的交互并不是ssh连接过程中出现的让输入 yes的交互,因为paramiko模块在连接过程中会自动处理好yes确认。这里的交互是指后面的cmd需要的执行的程序可能出现交互的情况下,可以通 过该参数进行交互。
stdout标准输出,在输出内容比较少时,可以通过直接使用read读取出所有的输出;但在输出内容比较多时,建议通过按行读取进行处理。不过按行读取时,每行结尾会有换行符\n,这样输出的结果很不美观。可以通过strip进行字符串的处理。
在函数调用过程中需要注意的是,IP、username、passwd都是属于字符串型的,所以需要加引号。后面执行的cmd,如果有多个命令需要操作时,需要通过分号进行分割。
四、paramiko sftp示例
单个文件小传下载的示例:
代码如下 | 复制代码 |
import paramiko |
一个目录下多个文件上传下载的示例:
代码如下 | 复制代码 |
#!/usr/bin/env python |
注:本处的目录下所有文件进行下载或上传的示例中,在遇到目录下还有嵌套的目录存在时,会将目录也当做文件进行处理,所以如果想要更加的完美的话,可以通过引入stat模块下的S_ISDIR方法进行处理
paramiko.transport对象也支持以socket的方式进行连接,如下示例:
代码如下 | 复制代码 |
import paramiko |
五、利用paramiko实现ssh的交互式连接
以下是通过paramiko模块直接用ssh协议登陆到远程服务器的操作代码,这里先定义一个interactive模块,代码如下:
代码如下 | 复制代码 |
import socket |
代码内容可以从paramiko 在github项目上的demo里获取。再另外写一个ssh_inter.py的交互主程序,内容如下:
代码如下 | 复制代码 |
import paramiko |
执行效果就像我们平时直接使用ssh登录一样。
六、总结
paramiko模块是一个比较强大的ssh连接模块,以上的示例只是列出了该模块的一些简单的使用方法,还可以使用threading模块加块程序并发 的速度;也可以使用configparser模块处理配置文件,而我们将所有IP、用户信息操作都放入配置文件;使用setproctitle模块为执行 的程序加一个容易区分的title等。
同样,虽然连fabric这样大名鼎鼎的软件使用的ssh都是用paramiko模块进行的封装,不过你依然可以选择不使用它,你也可以选择pexpect模块实现封装一个简易的ssh连接工具、或者使用同样比较火的salt-ssh模块。
paramiko模块是基于Python实现的ssh远程安全链接,实现命令远程、文件传输、SSH代理等功能。本文详细介绍了paramiko模块常用的方法,且实用价值非常高,稍作修改就能做出一个实用的运维工具。
安装
letong@me:~$ sudo pip install paramiko
简单的远程执行命令实例
#!/usr/bin/env python
import paramiko
hostname='127.0.0.1'
username='root'
password='123456'
port=2222
ssh=paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect(hostname=hostname,port=port,username=username,password=password)
stdin,stdout,stderr=ssh.exec_command('ls /')
print stdout.read()
ssh.close()
SSHClient类
SSHClient类是SSH服务会话的高级表示,封装了传输、通道以及SFTPClient的校验、建立方法,通常用于执行命令。
connect方法
connect(self, hostname, port=22, username=None,password=None, pkey=None, Key_filename=None, timeout=None, allow_agent=True,look_for_keys=True, compress=False)
参数说明:
hostname,连接目标的主机地址
port,连接目标的端口,默认22
username,用户名
password,用户密码
pkey,私钥方式用户验证
key_filename,私钥文件名
timeout,超时时间
allow_agent,是否允许ssh代理
look_for_keys,是否允许搜索私钥文件
compress,打开时是否压缩
exec_command方法
exec_command(self, command, bufzise=-1)
参数说明:
command,执行的命令
bufsize,文件缓冲区大小,-1不限制
load_system_host_keys方法
load_system_host_keys(self, filename=None)
参数说明:
filename,指定远程主机公钥文件
set_missing_host_key_policy方法
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
参数说明:
AutoAddPolicy,自动添加主机名及密钥到本地并保存,不依赖load_system_host_keys()配置
RejectPolicy,自动拒绝未知主机名和密钥,依赖load_system_host_keys()配置
WarnningPolicy,功能与AutoAddPolicy相同,但是未知主机会报警
SFTPClient类
根据SSH传输协议的sftp会话,实现远程文件上传、下载等操作。
from_transport方法
from_transport(cls, t)
参数说明:
t,一个已通过验证的传输对象
例:
>>> import paramiko
>>> a = paramiko.Transport((“127.0.0.1″,2222))
>>> a.connect(username=”root”, password=’123456′)
>>> sftp = paramiko.SFTPClient.from_transport(a)
put方法
put(self, localpath, remotepath, callback=None,confirm=True)
参数说明:
localpath,上传源文件的本地路径
remotepath,目标路径
callback,获取接收与总传输字节数
confirm,上传完毕后是否调用stat()方法,以便确认文件大小
例:
>>> localpath=’ftp-test.log’
>>> remotepath=’/data/ftp-test.log’
>>> sftp.put(localpath,remotepath)
get方法
get(self, remotepath, localpath, callback=None)
参数说明:
remotepath,需要下载的远程文件
localpath,本地存储路径
callback,同put方法
其他方法
mkdir,用于创建目录
remove,删除目录
rename,重命名
stat,获取文件信息
listdir,获取目录列表