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写的服务监控程序实例
Jan 31 Python
python正则表达式面试题解答
Apr 28 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python实现微信打飞机游戏
Mar 24 Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
python 下划线的多种应用场景总结
May 12 Python
python之json文件转xml文件案例讲解
Aug 07 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一些公用函数的集合
2008/03/27 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
python多线程http下载实现示例
2013/12/30 Python
python中异常捕获方法详解
2017/03/03 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
Django URL参数Template反向解析
2020/11/24 Python
美国家居装饰店:Pier 1
2019/09/04 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
opencv实现图像平移效果
2021/03/24 Python
夏季奶茶店创业计划书
2014/01/16 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
诚信贷款承诺书
2014/05/30 职场文书
作风建设年活动总结
2014/08/27 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
安全生产奖惩制度
2015/08/06 职场文书
关于车尾的标语大全
2015/08/11 职场文书
vue选项卡切换的实现案例
2022/04/11 Vue.js