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 代码优化详解
Oct 27 Python
Python标准异常和异常处理详解
Feb 02 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
Python标准库sched模块使用指南
Jul 06 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
Python3并发写文件与Python对比
Nov 20 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
Django ORM filter() 的运用详解
May 14 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
python自动12306抢票软件实现代码
2018/02/24 Python
python图书管理系统
2020/04/05 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
super关键字的用法
2012/04/10 面试题
大三学生学年自我鉴定
2014/09/12 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
学校运动会广播稿
2014/10/11 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
党员个人年度总结
2015/02/14 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
重温入党誓词主持词
2015/06/29 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js