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分割和拼接字符串
Nov 01 Python
python监控网站运行异常并发送邮件的方法
Mar 13 Python
django之session与分页(实例讲解)
Nov 13 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
python实现彩票系统
Jun 28 Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
python try...finally...的实现方法
Nov 25 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
深入理解PHP原理之异常机制
2010/08/21 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
Destoon模板制作简明教程
2014/06/20 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
在Python中使用元类的教程
2015/04/28 Python
python 网络爬虫初级实现代码
2016/02/27 Python
Django在win10下的安装并创建工程
2017/11/20 Python
python Kmeans算法原理深入解析
2019/08/23 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
应届生英语教师求职信
2013/11/05 职场文书
一年级班主任感言
2014/03/08 职场文书
岗位职责怎么写
2014/03/14 职场文书
单位承诺书格式
2014/05/21 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
维稳承诺书
2015/01/20 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS