[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)