抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

[toc]

简介

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

paramiko 的安装

1、 paramiko 支持pip、 easy_install 或者源安装方式,很方便解决依赖的问题,具体安装命令如下;

# pip easy_install paramiko
# easy_install paramiko

2、 paramiko 依赖第三方的Crypto、Ecdsa包及Python开发包python-devel的支持,源码如下;

# yum -y 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 https://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 ..
# git clone https://github.com/paramiko/paramiko.git
# cd paramiko
# python setup.py install

3、 校验安装结果,导入模块 没有提示异常,则说明该包安装成功;

➜  ~ ipython
Python 2.7.14 (default, Sep 25 2017, 09:53:22) 
Type "copyright", "credits" or "license" for more information.

IPython 5.5.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import paramiko 

In [2]:

4、使用密码认证方式,通过exec_command()方法执行命令;

➜  test cat paramiko_ssh.py 
#!/usr/bin/env python 
# -*- coding: utf-8 -*-
import paramiko

hostname = '192.168.0.78'
username = 'root'
password = 'paramiko_test*5'
paramiko.util.log_to_file('syslogin.log') # 发送paramiko 日志到syslog 文件
ssh=paramiko.SSHClient() # 创建一个ssh客户端 client对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_host_keys()
# 获取客户端host_keys,默认 ~/.ssh/known_hosts
#ssh.load_system_host_keys(filname='/Users/macbookdzsbe/.ssh/known_hosts')  # 获取客户端host_keys,默认 ~/.ssh/known_hosts
# ssh.load_host_keys(filename='/root/.ssh/known_hosts')
ssh.connect(hostname=hostname,username=username,password=password)# 创建ssh连接
stdin,stdout,stderr=ssh.exec_command('netstat -tnlup') #调用远程执行命令方法exec_command
# 打印命令执行结果,得到Pyhton列表形,可以使用stdout.readlines()
print stdout.read()
stdin,stdout,stderr=ssh.exec_command('date')
print stdout.readlines()
ssh.close # 关闭 ssh 连接
➜  test python paramiko_ssh.py 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      885/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1341/master         
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      18341/mongod        
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1266/mysqld         
tcp6       0      0 :::22                   :::*                    LISTEN      885/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1341/master         
udp        0      0 127.0.0.1:323           0.0.0.0:*                           624/chronyd         
udp6       0      0 ::1:323                 :::*                                624/chronyd         

[u'2018\u5e74 01\u6708 12\u65e5 \u661f\u671f\u4e94 16:50:33 CST\n']

5、 paramiko 的核组件

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

6、 SSHClient类

SSHClient类是SSH服务会话的高级表示,该类封装了传输(transport)、通道(channel)
及SFTPClient的检验、建立的方法,通常用于执行远程命令

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

SSHClient类方法使用

1、 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类型),连接的目标主机地址;
# prot (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时打开压缩

2、 exec_command 方法

远程命令执行方法,该命令的输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)

# 方法定义 
exec_command(self, command, bufsize=-1)
# 参数说明
# command (str 类型), 执行的命令串;
# bufsize (int 类型), 文件缓冲区大小,默认为-1(不局限);

3、loa_syste_host_keys 方法

加载本地公钥校验文件,默认为~/.ssh/known_hosts,非默认路径需要手工指定;

load_system_host_keys(self, filename=None)

# 参数说明
fiename(str类型 ),指定远程主机公钥记录文件;

4、 set_missing_host_key_policy 方法

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

# 使用方法如下
ssh=paramiko.SSHClient() 
ssh.set_missing_host_keypolicy(paramiko.AutoAddPolicy)

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

SFTPClient类

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

1、 from_transport 方法

创建一个已连接通的SFTP客户端通道;

# 方法定义 
from_transport(cls, t)
# 参数说明
t(Transport),一个已经通过验证的传输对象。
t = paramiko.Transport(("192.168.0.78", 22))
t.connect(username="root",password="paramiko_test*5")
sftp =paramiko.SFTPClient.from_transport(t)

2、 put 方法

上传本地文件到远程SFTP服务端;

put(self, localpath, remotepath, callback=None, confirm=True)
# 参数说明
# localpath (str 类型),需上传的本地文件(源);
# remotepath (str 类型),远程路径(目标); 
# collback(functioin(int,int)),获取已接收的字字数及总传输字节数,以便回调函数高用,默认为None;  
# connfirm (bool类型),文件上传完毕后是否调用 stat()方法,以便确认文件的大小。 
localpath='/var/log/httpd/access.log'
remotepath='/data/bak/log/httpd/access.log'
sftp.put(localpath,remotepath)

3、 get方法

从远程SFTP服务端下载文件到本地;

get(self, remotepth, localpath, callbak=None)
# 参数说明
# remotepath (str类型),需下载的远程文件 (源文件); 
# localpath (str类型),本地路径(目标);
# callback(function(int, int)),获取已接收的字节数及总传输字节数,以便回调函数及调用,默认为None
remotepath='/var/log/httpd/access.og'
localpath='/data/bak/log/httpd/access.log'
sftp.get(remotepath,localpath)

4、其他方法

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

5、SFTPClient类应用示例

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
import paramiko
import os
username = "root"
password = "paramiko_test*5"
hostname = "10.180.55.118"
port = 22

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

    sftp.put("/tmp/next.vim.log", "/home/root/next.vim.log") #上传文件 
    sftp.get("/etc/hosts", "/tmp/hosts") #下载文件 
    sftp.mkdir("/home/testdir",0700) #创建文件 
    sftp.rmdir("/home/root/test5.sql") #删除目录 
    sftp.rename("/home/root/test1.sql", "/home/root/test5.sql") #文件重命名
    print sftp.stat("/home/root/test5.sql") #打印文件信息
    print sftp.listdir("/home/root") # 打印目录列表
    t.close();
except Exception, e:
    print str(e)

评论