Paramiko - QLGQ/learning-python GitHub Wiki

Introduction

paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能。

Installation

方法一:pip安装 sudo pip install paramiko

方法二:源码安装
paramiko依赖第三方的Crypto、Ecdsa包及Python开发包python-devel的支持,源码安装步骤如下:

# sudo -y pip install python-devel
# wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
# tar -zxvf pycrypto-2.6.tar.gz
# cd pycrypto-2.6
# python setup.py install
# cd ..
# wget http://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.10.tar.gz --no-check-certificate
# tar -zxvf ecdsa-0.10.tar.gz
# cd ecdsa-0.10
# python setup.py install
# cd ..
# wget https://github.com/paramiko/paramiko/archive/v1.12.2.tar.gz
# tar -zxvf v1.12.2.tar.gz
# cd paramiko-1.12.2/
# python setup.py install

在终端进入python shell页面,输入import paramiko,若没提示异常则说明安装成功。

Example

下面介绍一个简单实现远程SSH运行命令的示例。该示例使用密码认证方式,通过exec_command()方法执行命令,代码如下:

【/home/test/paramiko/simple1.py】

#!/usr/bin/env python
#-*-coding: utf-8-*-

import paramiko

hostname='192.168.1.21'
username='root'
password='SKJh935yft#'
paramiko.util.log_to_file('syslogin.log')  # 发送paramiko日志到syslogin.log文件

ssh=paramiko.SSHClient()  # 创建一个ssh客户端client对象
ssh.load_system_host_keys() # 获取客户端host_keys,默认~/.ssh/known_hosts,非默认路径需指定
ssh.connect(hostname=hostname, username=username, password=password)  # 创建ssh连接
stdin, stdout, stderr=ssh.exec_command('free -m')  # 调用远程执行命令方法exec_command()
print stdout.read()  # 打印命令执行结果,得到Python列表形式,可以使用stdout.readlines()
ssh.close()  # 关闭ssh连接

程序的运行结果如下所示:

ubuntu@et-wuqiang:~/test/paramiko$ python simple1.py
             total       used       free     shared    buffers     cached
Mem:          2002       1115        886          0         99        869
-/+ buffers/cache:        146       1855
Swap:            0          0          0

paramiko的核心组件

paramiko包含两个核心组件,一个为SSHClient,另一个为SFTPClient类。

SSHClient类

SSHClient类是SSH服务会话的高级表示,该类封装了传输(transport)、通道(channel)以及SFTP的校验、建立的方法,通常用于执行远程命令,下面是一个简单的例子:

client = SSHClient()
client.load_system_host_keys()
client.connect('ssh.example.com')
stdin, stdout, stderr = client.exec_command('ls -l')

下面介绍SSHClient常用的几个方法。

connect方法

connect方法实现了远程SSH连接并校验。
方法定义: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:(str类型),连接的目标主机地址
  • port:(int类型),连接目标主机的端口,默认为22
  • username:(str类型),校验的用户名(默认为当前的本地用户)
  • password:(str类型),密码用于身份校验或解锁私钥
  • pkey:(PKey类型),私钥方式用于身份验证
  • key_filename:(str or list(str)类型),一个文件名或文件名的列表,用于私钥的身份验证
  • timeout:(float类型),一个可选的超时时间(以秒为单位)的TCP连接
  • allow_agent:(bool类型),设置为False时用于禁用连接到SSH代理
  • look_for_keys:(bool类型),设置为False用来禁用在~/.ssh中搜素私钥文件
  • compress:(bool类型),设置为True时打开压缩

exec_command方法

远程命令执行方法,该命令的输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)的Python文件对象,方法定义:exec_command(self, command, bufsize=-1)
参数说明:

  • command:(str类型),执行的命令串
  • bufsize:(int类型),文件缓冲区大小,默认为-1(不限制)

load_system_host_keys方法

加载本地公钥校验文件,默认为此~/.ssh/known_hosts,非默认路径需要手工指定,方法定义:load_system_host_keys(self, filename=None)
参数说明:

  • filename:(str类型),指定远程主机公钥记录文件

set_missing_host_key_policy方法

设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种,分别是AutoAddPolicy、RejectPolicy(默认)、WarningPolicy,仅限用于SSHClient类,分别代表的含义如下:

  • AutoAddPolicy:自动添加主机名及主机密钥到本地HostKeys对象,并将其保存,不依赖load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不产生影响
  • RejectPolicy:自动拒绝未知的主机名和密钥,依赖load_system_host_keys()的配置
  • WarningPolicy:用于记录一个未知的主机密钥的Python警告,并接受它,功能上与AutoPolicy相似,但未知主机会有告警。

使用方法如下:

ssh=paramiko.SSHCLient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

SFTPClient类

SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程文件操作,比如文件上传、下载、权限、状态等操作。下面介绍SFTPClient类的常用方法。

from_transport方法

创建一个已联通的SFTP客户端通道,方法定义:from_transport(cls, t)
参数说明:t(Transport),一个已通过验证的传输对象。
例子说明:

t = paramiko.Transport(("192.168.1.22", 22))
t.connect(username="root", password="KJSdj348g")
sftp = paramiko.SFTPClient.from_transport(t)

put方法

上传本地文件到远程SFTP服务端,方法定义:put(self, localpath, remotepath, callback=None, confirm=True)
参数说明:

  • localpath:(str类型),需上传的本地文件(源)
  • remotepath:(str类型),远程路径(目标)
  • callback(function(int, int)):获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None
  • confirm:(bool类型),文件上传完毕后是否调用stat()方法,以便确认文件的大小
    例子说明:
localpath = '/home/access.log'
remotepath = '/data/logs/access.log'
sftp.put(localpath, remotepath)

get方法

从远程SFTP服务端下载文件到本地,方法定义:get(self, remotepath, localpath, callback=None)
参数说明:

  • remotepath:(str类型),需下载的远程文件(源)
  • localpath:(str类型),本地路径(目标)
  • callback(function(int, int)):获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None
    例子说明:
remotepath='/data/logs/access.log'
localpath='/home/access.log'
sftp.get(remotepath, localpath)

其他方法

SFTPClient类其他常用方法说明:

  • mkdir:在SFTP服务器端创建目录,如sftp.mkdir("/home/userdir",0755)
  • remove:删除SFTP服务器端指定目录,如sftp.remove("/home/userdir")
  • rename:重命名SFTP服务器端文件或目录,如sftp.rename("/home/test.sh","/home/testfile.sh")
  • stat:获取远程SFTP服务器端指定文件信息,如sftp.stat("/home/testfile.sh")
  • listdir:获取远程SFTP服务器端指定目录列表,以Pyhton的列表(List)形式返回,如sftp.listdir("/home")

SFTPClient类应用示例

下面为SFTPClient类的一个完整示例,实现了文件上传、下载、创建与删除目录等,需要注意的是,put和get方法需要指定文件名,不能省略。代码如下:

#!/usr/bin/env python
import paramiko

username = "root"
password = "KJsd8t34d"
hostname = "192.168.1.21"
port = 22

try:
    t =paramiko.Transport((hostname, port))
    t.connect(username=username, password=password)
    sftp = paramiko.SFTPClient.from_transport(t)

    sftp.put("/home/user/info.db", "/data/user/info.db")    # 文件上传
    sftp.get("/data/user/info_1.db", "/home/user/info_1.db")    # 下载文件
    sftp.mkdir("/home/userdir", 0755)    # 创建目录
    sftp.rmdir("/home/userdir")    # 删除目录
    sftp.rename("/home/test.sh", "/home/testfile.sh")    # 文件重命名
    print sftp.sta("/home/testfile.sh")    # 打印文件信息
    print sftp.listdir("/home")    # 打印目录列表
    t.close();
except Exception, e:
    print str(e)