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中使用urllib2防止302跳转的代码例子
Jul 07 Python
python批量同步web服务器代码核心程序
Sep 01 Python
python发送邮件实例分享
Jul 28 Python
详解Numpy中的广播原则/机制
Sep 20 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
python新手学习可变和不可变对象
Jun 11 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
Python Map 函数的使用
Aug 28 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 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 session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
PHP实现简易图形计算器
2020/08/28 PHP
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
Python列表推导式的使用方法
2013/11/21 Python
Python中的ctime()方法使用教程
2015/05/22 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python递归全排列实现方法
2018/08/18 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
党员民主评议总结
2014/10/20 职场文书
投诉信回复范文
2015/07/03 职场文书
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL
mysql数据库隔离级别详解
2022/06/16 MySQL