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中的__new__()方法的使用
Apr 09 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
Python当中的array数组对象实例详解
Jun 12 Python
Python制作词云图代码实例
Sep 09 Python
Django配置文件代码说明
Dec 04 Python
python 字典套字典或列表的示例
Dec 16 Python
matlab中二维插值函数interp2的使用详解
Apr 22 Python
Python是什么 Python的用处
May 26 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
Jul 30 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php Undefined index的问题
2009/06/01 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
python time.strptime格式化实例详解
2021/02/03 Python
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
教师自我鉴定
2013/12/13 职场文书
教师实习自我鉴定
2013/12/13 职场文书
如何写一份好的自荐信
2014/01/02 职场文书
高三政治教学反思
2014/02/06 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
人事任命书格式
2014/06/05 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
法律意见书范文
2015/06/04 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技
Golang gRPC HTTP协议转换示例
2022/06/16 Golang