python paramiko模块学习分享


Posted in Python onAugust 23, 2017

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。

首先让我们理清以下几个名词:

SSHClient:包装了Channel、Transport、SFTPClient
Channel:是一种类Socket,一种安全的SSH传输通道;
Transport:是一种加密的会话(但是这样一个对象的Session并未建立),并且创建了一个加密的tunnels,这个tunnels叫做Channel;
Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话.

paramiko 参考http://docs.paramiko.org/en/2.0/index.html 

下载安装

pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto

pip3 install pycrypto
pip3 install paramiko 

具体模块使用 

SSHClient:

远程连接分为两种:(1)基于用户名密码连接 (2)基于公钥秘钥连接

通过是用paramiko远程操作,其实本质也分为两种:(1)只用SSHClient (2)自己创建一个transport 

基于用户名密码连接 

import paramiko
 
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='host', port=22, username='root', password='123')
# 执行命令  stdout命令结果,stderr错误
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果 
result = stdout.read()
# 关闭连接
ssh.close()

SSHClient 封装 Transport

import paramiko
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', password='123')
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
 
transport.close()

基于公钥秘钥连接

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='host', port=22, username='root', key=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()

SSHClient 封装Transport

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('df')
transport.close()

SFTPClient:

用于连接远程服务器并进行上传下载功能。

基于用户名密码上传下载

import paramiko
 
transport = paramiko.Transport(('hostname',22))
transport.connect(username='root',password='123')
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
 
transport.close()

基于公钥秘钥上传下载

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', pkey=private_key )
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
 
transport.close()

Demo: 实现远程命令执行和文件上传

import paramiko
 
class SSHConnection(object):
 
  def __init__(self, host='192.168.12.68', port=22, username='locojoy',pwd='123321QQ!'):
    self.host = host
    self.port = port
    self.username = username
    self.pwd = pwd
    self.__k = None
 
  def run(self):
    self.connect() # 连接远程服务器
    self.upload('db.py','/tmp/1.py') # 将本地的db.py文件上传到远端服务器的/tmp/目录下并改名为1.py
    self.cmd('df') # 执行df 命令
    self.close()  # 关闭连接
 
  def connect(self):
    transport = paramiko.Transport((self.host, self.port))
    transport.connect(username=self.username, password=self.pwd)
    self.__transport = transport
 
  def close(self):
    self.__transport.close()
 
  def upload(self,local_path,target_path):
    sftp = paramiko.SFTPClient.from_transport(self.__transport)
    sftp.put(local_path,target_path)
 
  def cmd(self, command):
    ssh = paramiko.SSHClient()
    ssh._transport = self.__transport
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command(command)
    # 获取命令结果
    result = stdout.read()
    print(result)
    return result
 
obj = SSHConnection()
obj.run()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python执行子进程实现进程间通信的方法
Jun 02 Python
星球大战与Python之间的那些事
Jan 07 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Django返回json数据用法示例
Sep 18 Python
python3大文件解压和基本操作
Dec 15 Python
一篇文章快速了解Python的GIL
Jan 12 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
基于python实现检索标记敏感词并输出
May 07 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
Python实现简单猜数字游戏
Feb 03 Python
定制FileField中的上传文件名称实例
Aug 23 #Python
基于python元祖与字典与集合的粗浅认识
Aug 23 #Python
Python 多线程Threading初学教程
Aug 22 #Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 #Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 #Python
Python实现的矩阵类实例
Aug 22 #Python
Python实现图片转字符画的示例
Aug 22 #Python
You might like
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
Python实现网络端口转发和重定向的方法
2016/09/19 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
通信工程毕业生求职信
2013/11/16 职场文书
销售经理工作职责范文
2013/12/03 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
简单的项目建议书模板
2014/03/12 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
师范类求职信
2014/06/21 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
毕业典礼致辞
2015/07/29 职场文书
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL