python中使用paramiko模块并实现远程连接服务器执行上传下载功能


Posted in Python onFebruary 29, 2020

paramiko模块

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

通过ssh链接服务器并执行想要的命令,类似于XShell

ansible(远程批量管理服务器)底层源码其实就是paramiko模块实现的

安装

pip3 install paramiko

使用

前提须知:paramiko模块即支持用户名密码的方式,也支持公钥私钥的方式操作服务器

1.用户名密码的方式:

# 执行命令
import paramiko
# 创建链接对象
ssh = paramiko.SSHClient()
# 允许链接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 链接服务器
ssh.connect(hostname='服务器ip地址',port='端口号',username='用户名',password='密码')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ip a')
"""
stdin 是用来输入额外的参数的  -y
stdout 命令的返回结果
stderr 错误的结果
"""
# 获取命令执行的结果
res = stdout.read()
print(res.decode('utf-8'))
# 关闭链接
ssh.close()

2.公钥私钥的方式

首先在windows上产生公钥私钥对

可以用openssl工具产生,也可以用Git Bash工具产生(需要安装git)
1.打开 Git Bash工具 输入命令 ssh-keygen
2.输入完命令一直按回车即可
3.在  c/user/用户名下的文件/.ssh 的目录中生成了两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥
4.将公钥内容复制到你的linux服务器下的 /root/.ssh/authorized_keys文件中即可

复制私钥文件到项目根目录下,我这里重命名为a.txt

import paramiko
# 读取本地私钥
private_key = paramiko.RSAKey.from_private_key_file('a.txt')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='服务器ip地址', port=22, username='用户名', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls /')
# 获取命令结果
result = stdout.read()
print(result.decode('utf-8'))
# 关闭连接
ssh.close()

实现上传下载文件

1.用户名和密码的方式:

import paramiko
# 用户名和密码
transport = paramiko.Transport(('服务器ip地址', 22))
transport.connect(username='用户名', password='密码')
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
# sftp.put("a.txt", '/data/tmp.txt') # 注意上传文件到远程某个文件下 文件必须存在
# 下载文件
sftp.get('/data/tmp.txt', 'hahaha.txt') # 将远程文件下载到本地并重新命令
transport.close()

2.公钥和私钥的方式:

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('a.txt')
transport = paramiko.Transport(('服务器地址', 22))
transport.connect(username='用户名', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('manage.py', '/data/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
transport.close()

下面将执行命令和上传下载文件 封装到一个类里面

SSHProxy类的封装

假如我想链接服务器执行三条命令,并且上传一个文件内容

大部分都会操作几次就链接几次服务器,效率较低,代码冗余

我们想实现一个类里面包含了执行命令和上传下载文件的操作

# 类的代码无需掌握 只需要会拷贝使用即可
import paramiko
class SSHProxy(object):
  # 这里的参数 你可以再加公钥私钥的形式
  def __init__(self, hostname, port, username, password):
    self.hostname = hostname
    self.port = port
    self.username = username
    self.password = password
    self.transport = None
  def open(self): # 给对象赋值一个上传下载文件对象连接
    self.transport = paramiko.Transport((self.hostname, self.port))
    self.transport.connect(username=self.username, password=self.password)
  def command(self, cmd): # 正常执行命令的连接 至此对象内容就既有执行命令的连接又有上传下载链接
    ssh = paramiko.SSHClient()
    ssh._transport = self.transport
    stdin, stdout, stderr = ssh.exec_command(cmd)
    result = stdout.read()
    return result
  def upload(self, local_path, remote_path):
    sftp = paramiko.SFTPClient.from_transport(self.transport)
    sftp.put(local_path, remote_path)
    sftp.close()
  def close(self):
    self.transport.close()
  def __enter__(self): # 对象执行with上下文会自动触发
    self.open()
    return self # 这里发挥上面with语法内的as后面拿到的就是什么 
  def __exit__(self, exc_type, exc_val, exc_tb): # with执行结束自动触发
    self.close()

使用流程

"""
上述的封装操作在使用的使用 必须按照下面的顺序
obj = SSHProxy(...)
obj.open() # 产生的对象必须要先执行open方法
obj.command('ls /')
obj.command('cat /data/tmp.txt')
obj.upload(...)
obj.upload(...)
obj.close()

利用文件操作的特性
f = open()
f.close()
嫌上述操作麻烦 利用with上下文做处理了
with open() as f:
  pass
as后面的值由__enter__方法返回值决定 返回什么就是什么

# 一旦对象被执行with会自动触发对象内部的__enter__方法 with结束之后还会自动触发__exit__方法
obj = SSHProxy(1,2,3,4)
with obj as f:
  pass

封装之后按照下面的方式使用即可

with SSHProxy(....) as obj:
  obj.command()
  obj.command()
  obj.upload()
  obj.upload()
  obj.command()
"""

拓展: __enter__ 和 __exit__ 的使用

class Foo(object):
  def __enter__(self):
    print('他进来了')
    return 123
  def __exit__(self, exc_type, exc_val, exc_tb):
    print('他就这么出去了')
obj = Foo()
with obj as f:
  print(f)
"""
执行结果:
他进来了
123
他就这么出去了
"""

总结:as后面的值由 __enter__ 方法返回值决定 返回什么就是什么,

​ 一旦对象被执行with会自动触发对象内部的 __enter__ 方法 with结束之后还会自动触发 __exit__ 方法

面试题

# 面试题"""
请在Context类中添加代码完成该类的实现(意思是怎么样修改才能实现以下代码并不会报错)
"""
class Context:
 pass
with Context() as ctx:
 ctx.do_something()
# 答案
class Context:
 def __enter__(self):
    return self
  def __exit__(self,*args,**kwargs):
    pass
 def do_something(self):
    pass

到此这篇关于python中使用paramiko模块并实现远程连接服务器执行上传下载功能的文章就介绍到这了,更多相关python paramiko模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python selenium如何设置等待时间
Sep 15 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
Python通过future处理并发问题
Oct 17 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
python实现海螺图片的方法示例
May 12 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
Python图片的横坐标汉字实例
Dec 04 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 #Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 #Python
Python使用type动态创建类操作示例
Feb 29 #Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 #Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 #Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 #Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 #Python
You might like
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
微信小程序云开发之新手环境配置
2019/05/16 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
9种方法优化jQuery代码详解
2020/02/04 jQuery
python中pika模块问题的深入探究
2018/10/13 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
python map比for循环快在哪
2020/09/21 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
JBL英国官网:JBL UK
2018/07/04 全球购物
完美主义个人的自我评价
2014/02/17 职场文书
消防标语大全
2014/06/07 职场文书
大专毕业生求职信
2014/07/05 职场文书
合作意向协议书
2015/01/29 职场文书
团队拓展训练感想
2015/08/07 职场文书
Python实现对齐打印 format函数的用法
2022/04/28 Python