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

 更新时间:2020年02月29日 20:22:48   作者:tomjoy  
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。这篇文章主要介绍了python中使用paramiko模块并实现远程连接服务器执行上传下载功能,需要的朋友可以参考下

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实现简单的贪吃蛇游戏

    这篇文章主要为大家详细介绍了python实现简单的贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Python多线程与异步处理在HTTP请求中的应用方式

    Python多线程与异步处理在HTTP请求中的应用方式

    这篇文章主要介绍了Python多线程与异步处理在HTTP请求中的应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • jupyter notebook指定启动目录的方法

    jupyter notebook指定启动目录的方法

    这篇文章主要介绍了jupyter notebook指定启动目录的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python实现堆排序的方法详解

    Python实现堆排序的方法详解

    这篇文章主要介绍了Python实现堆排序的方法,结合实例形式详细分析了堆排序的原理,实现方法与相关注意事项,需要的朋友可以参考下
    2016-05-05
  • Python访问OPCUA服务器,订阅一个变量标签方式

    Python访问OPCUA服务器,订阅一个变量标签方式

    这篇文章主要介绍了Python访问OPCUA服务器,订阅一个变量标签方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • pandas-resample按时间聚合实例

    pandas-resample按时间聚合实例

    今天小编就为大家分享一篇pandas-resample按时间聚合实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 使用Python获取字典键对应值的两种方法

    使用Python获取字典键对应值的两种方法

    对于字典通过键获得值非常简单,但通过值获得键则需绕些弯子,下面这篇文章主要给大家介绍了关于如何使用Python获取字典键对应值的相关资料,需要的朋友可以参考下
    2022-04-04
  • python中的decorator的作用详解

    python中的decorator的作用详解

    这篇文章主要介绍了python中的decorator的作用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Python解析pcap文件示例

    Python解析pcap文件示例

    这篇文章主要为大家介绍了Python解析pcap文件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 对Python中class和instance以及self的用法详解

    对Python中class和instance以及self的用法详解

    今天小编就为大家分享一篇对Python中class和instance以及self的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06

最新评论