Python基于模块Paramiko实现SSHv2协议


Posted in Python onApril 28, 2020

简介:

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。

有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。

由于paramiko属于第三方库,所以需要使用如下命令先行安装 :pip install paramiko

paramiko包含两个核心组件:SSHClient和SFTPClient。

SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。

SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

# Paramiko中的几个基础名词:
1、Channel:是一种类Socket,一种安全的SSH传输通道;
2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。

SSHClient常用的方法介绍

connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。

常用参数

hostname 连接的目标主机
port=SSH_PORT 指定端口
username=None 验证的用户名
password=None 验证的用户密码
pkey=None 私钥方式用于身份验证
key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
compress=False, 是否打开压缩

set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:

设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:

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

WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

exec_command():在远程服务器执行Linux命令的方法。

open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

# 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
sftp = client.open_sftp()
sftp.put('test.txt','text.txt')
SSHClient常用的方法举例

1.基于用户名和密码登入方式

import paramiko
class param():
 def param_iko(self):
  #实例化SSHClient
  client = paramiko.SSHClient()
  #自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  #连接SSH服务端,以用户名和密码进行认证
  client.connect(hostname='192.168.1.200', port=22, username='root', password='a123')
  #打开一个Channel并执行命令
  stdin, stdout, stderr = client.exec_command('df -h ')
  #打印执行结果
  print(stdout.read().decode('utf-8'))
  #关闭SSHClient
  client.close()
if __name__=='__main__':
  param().param_iko()

通过公钥连接,前提是两台Linux可以互相连接

两台服务器需要ssh免秘钥登入

import paramiko
class param_my():
 def param_miyao(self):
  #配置私人密钥文件位置
  private = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
  #实例化SSHClient
  client = paramiko.SSHClient()
  #自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  #连接SSH服务端,以用户名和密码进行认证
  client.connect(hostname='192.168.1.250',port=22,username='root',pkey=private)
  #打开一个Channel并执行命令
  stdin, stdout, stderr = client.exec_command('df -h ')
  #打印执行结果
  print(stdout.read().decode('utf-8'))
  #关闭SSHClient
  client.close()
if __name__=='__main__':
  param_my().param_miyao()
[root@master test]# python3 a.py 
文件系统        容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root  27G  21G 6.8G  75% /
devtmpfs        977M   0 977M  0% /dev
tmpfs         993M   0 993M  0% /dev/shm
tmpfs         993M 9.1M 984M  1% /run
tmpfs         993M   0 993M  0% /sys/fs/cgroup
/dev/sr0        3.8G 3.8G   0 100% /mnt/cdrom
/dev/sda1       1014M 161M 854M  16% /boot
tmpfs         199M   0 199M  0% /run/user/0
tmpfs         199M  12K 199M  1% /run/user/42

跨服务器上传和下载文件

import os,sys
import paramiko
class get_putclass():
  def get_put(self):
   t = paramiko.Transport(('192.168.1.250',22))
   t.connect(username='root',password='a123')
   sftp = paramiko.SFTPClient.from_transport(t)   #前面部分是192.168.1.250 远程机器上的文件,后半部分是取到本地的路径和文件名
   sftp.get('/root/file/test.txt','/home/python/tmp/test/test.txt')   #前面部分是本机器上的文件,后半部分是远程机器上的文件路径和文件名
   sftp.put('/home/python/tmp/test/a.py','/root/file/a.py')
   t.close()
if __name__=='__main__':
  get_putclass().get_put()

通过秘钥来上传下载文件

import os,sys
import paramiko
class get_put_myao():
  def get_put_miyao(self):
   pravie_key_path = '/root/.ssh/id_rsa'
   key = paramiko.RSAKey.from_private_key_file(pravie_key_path)
   t = paramiko.Transport(('192.168.1.250',22))
   t.connect(username='root',pkey=key)
   sftp = paramiko.SFTPClient.from_transport(t)
   sftp.put('/home/python/tmp/test/b.py','/root/file/b.py') 
   sftp.get('/root/file/test.txt','/home/python/tmp/test/test.txt') 
   t.close()
if __name__=='__main__':
  get_put_myao().get_put_miyao()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python open()文件处理使用介绍
Nov 30 Python
Python socket实现简单聊天室
Apr 01 Python
使用Python对微信好友进行数据分析
Jun 27 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
python内打印变量之%和f的实例
Feb 19 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
python绘制箱型图
Apr 27 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 Python
Python内置函数locals和globals对比
Apr 28 #Python
使用python实现CGI环境搭建过程解析
Apr 28 #Python
基于python连接oracle导并出数据文件
Apr 28 #Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 #Python
简单了解python shutil模块原理及使用方法
Apr 28 #Python
python脚本监控logstash进程并邮件告警实例
Apr 28 #Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 #Python
You might like
关于js和php对url编码的处理方法
2014/03/04 PHP
Yii快速入门经典教程
2015/12/28 PHP
Redis构建分布式锁
2017/03/28 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
[原创]图片分页查看
2006/08/28 Javascript
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
python最长回文串算法
2018/06/04 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python jieba库用法及实例解析
2019/11/04 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
Python插件机制实现详解
2020/05/04 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
公司活动邀请函
2014/01/24 职场文书
小学生安全保证书
2014/02/01 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
房产公证书范本
2014/04/10 职场文书
活动总结新闻稿
2014/08/30 职场文书
党员作风建设整改方案
2014/10/27 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
原告离婚代理词
2015/05/23 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
《游戏公平》教学反思
2016/02/20 职场文书