当前位置:   article > 正文

Paramiko库讲解

paramiko

目录

基本概念

Paramiko组件架构

Key handing类

Transport类

SFTPClient类

SSHClient类—主要使用的类

Python编写完整例子


基本概念

Paramiko是Python实现SSHv2协议的模块,支持口令认证和公钥认证两种方式

通过Paramiko可以实现通过Python进行安全的远程命令执行、文件传输等功能


Paramiko组件架构

Paramiko主要是通过不同的类来实现不同的功能

最常用的两个类是SSHClient类和SFTPClient类,分别提供SSH和SFTP功能

以下我们介绍Transport、SSHClient、SFTPClient、Key handing四种类来实现SSH基础功能

Key handing类

读取本地的密钥(私钥)创建密钥对象(此对象指的是数字签名),用于SSH公钥认证

使用口令认证(通过用户密码认证)时不需要此类

例子

  1. #从文件读取RSA私钥来创建密钥对象
  2. key=paramiko.RSAKey.from_private_key_file(r'C:\Users\exampleuser\.ssh\id_rsa')
  3. #从文件读取DSS私钥来创建密钥对象
  4. key=paramiko.DSSKey.from_private_key_file(r'C:\Users\exampleuser\.ssh\id_rsa')

注意

使用Key handing类时,需要提前把私钥对应的公钥拷贝到SSH服务器上,不然无法完成用户认证

Transport类

通过IP+端口号建立SSH连接

然后通过口令或公钥进行用户认证(认证通过后建立SSH Transport会话)

常用方法介绍

建立Transport对象,实例化SSH会话通道

paramiko.Transport(sock)

建立SSH会话连接,并使用密码或私钥进行身份认证。

connect(username=“,password=None,pkey=None)

关闭会话

close()

例子1通过口令认证与192.168.56.100建立SSH会话

  1. tran = paramiko.Transport(('192.168.56.100',22))
  2. tran.connect(username=‘client’,password=‘test’)    
  3. tran.close()

例子2通过公钥认证与192.168.56.100建立SSH会话(提前把公钥复制到服务器上)

  1. key = paramiko.RSAKey.from_private_key_file(r'C:\Users\exampleuser\.ssh\id_rsa')
  2. tran = paramiko.Transport(('192.168.56.100',22))
  3. tran.connect(username=‘client’, pkey=key)
  4. tran.close()
  5. #按照理论来说,公钥认证时不需要配置密码的
  6. #但是华为设备中需要配置密码,不然实现不了

SFTPClient类

通过一个打开的SSH Transport会话创建SFTP会话通道,完成文件的上传和下载

常用方法介绍

从打开的Transport创建一个SFTP会话连接

paramiko.SFTPClient.from_transport(T,window_size=None, max_packet_size=None)

T  

一个打开的Transport会话。

window_size

(可选参数)SFTP会话窗口大小。

max_packet_size

(可选参数)SFTP会话最大数据包大小

下载指定文件

get(remotepath, localpath)

remotepath

远程文件

localpath

本地主机的目的路径(该路径应包含文件名,仅指定目录可能会导致错误)

上传指定文件

put(localpath, remotepath)

localpath

本地文件

remotepath

SFTP服务器上的目的路径(该路径应包含文件名,仅指定目录可能会导致错误)

例子(下载设备的vrpcfg.cfg文件保存到本地改名为vrptest.cfg)

  1. tran = paramiko.Transport(('192.168.56.100',22))
  2. tran.connect(username=‘client’,password=‘test’)
  3. sftp=paramiko.SFTPClient.from_transport(tran)   
  4. local_path=r'C:\Users\exampleuser\.ssh\vrptest.cfg' 
  5. remote_path= '/vrpcfg.cfg'                      
  6. sftp.get(remote_path, local_path)
  7. tran.close()

SSHClient类—主要使用的类

可以实现Transport类和SFTPClient类的功能

常用方法介绍

实现远程服务器的连接与认证(完成Transport类的任务,建立SSH会话)

connect(hostname=None,port=None,username=None,password=None,key_filename=None,pkey=None)

hostname

连接的目标主机(只有该参数为必选参数)

port

指定端口(默认为22)

username

进行认证的用户名(默认为空)

password 

进行认证的用户密码(默认为空)

key_filename

一个文件名或文件列表,指定私钥文件(默认为空,类似于Key handing类)

pkey 

 指定私钥(把私钥复制过来,非私钥文件)

设置当连接到 没有已知主机密钥的 服务器时使用的策略(完成客户端对服务器的信任)

set_missing_host_key_policy(paramiko.client.AutoAddPolicy())

AutoAddPolicy

自动添加主机名及主机密钥到本地HostKeys对象(不依赖load_system_host_key的配置)即新建立ssh连接时不需要再输入yes或no进行确认。

WarningPolicy

用于记录一个未知的主机密钥的python警告并接受,功能上和AutoAddPolicy类似,但是会提示是新连接。

RejectPolicy

自动拒绝未知的主机名和密钥(依赖load_system_host_key的配置,此为默认选项)

客户端与服务器之间的信任-两者都相互信任之后建立SSH连接

服务器有客户端的公钥(或客户端输入正确的口令),可以实现服务器对客户端的信任(即用户认证可以实现)

客户端有服务器的公钥,可以实现客户端对服务器的信任

此方法解决的是客户端对服务器的信任问题

即如果此时客户端没有服务器的公钥,可以使用此策略(使得客户端直接信任服务器)

从系统文件中加载主机密钥(主机存储的关于服务器的公钥)

load_system_host_keys(filname)

filename

文件名(默认为空)

OpenSSH会把用户访问过每个计算机的公钥(public key)都记录在~/.ssh/known_hosts

在远程服务器执行Linux命令

exec_command()

在远程服务器上启动交互式shell会话

invoke_shell()

在一个会话连接中创建SFTP通道

open_sftp()

关闭连接

close()

例子

  1. #建立SSH会话
  2. client=paramiko.SSHClient()
  3. client.connect(hostname='192.168.56.100',port=22,username=‘client',key_filename='id_rsa')
  4. client.connect(hostname='192.168.56.100',port=22,username=‘client',password=‘123456')
  5. #信任所有服务器(自动接收服务器密钥)
  6. client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
  7. #基于ssh会话连接,启用一个交互式shell会话
  8. cli = client.invoke_shell()
  9. #基于ssh会话连接,在SSH服务器上创建一个SFTP会话
  10. sftp=client.open_sftp()
  11. #关闭SSH会话
  12. client.close()

Python编写完整例子

通过SSHClient类进行口令认证配置服务器(不同厂商的实现只是蓝色部分不一致)

前提是设备上已经配置好SSH用户等其它操作

  1. import paramiko
  2. import time
  3. ip  = '192.168.0.1'
  4. username = 'admin'
  5. password = 'admin@123'
  6. ssh_client = paramiko.SSHClient()
  7. ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  8. ssh_client.connect(hostname=ip,username=username,password=password)
  9. #进入网络设备(交换机)的命令模式了
  10. command = ssh_client.invoke_shell()
  11. print('已经成功登录')
  12. #输入命令(不同厂商的命令不一致,此处以华为为例子)
  13. command.send(‘screen-length 0 temporary\n’)
  14. # screen-length 0 temporary  显示时不分屏
  15. #例如dis cu查看配置时直接全部显示,不用再按回车/空格键逐页/逐行显示了
  16. command.send('sys\n')
  17. command.send('dis cu\n ')
  18. command.send('dis memory\n')
  19. time.sleep(1)             #在敲命令时间隔一段时间在敲下一跳命令
  20. #截屏 将输入的命令显示的内容显示出来
  21. outup = command.recv(65535).decode('ascii')
  22. print(outup)
  23. #关闭会话
  24. ssh_client.close()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/603427
推荐阅读
相关标签
  

闽ICP备14008679号