Python Paramiko模块的使用实际案例


Posted in Python onFebruary 01, 2018

本文研究的主要是Python Paramiko模块的使用的实例,具体如下。

Windows下有很多非常好的SSH客户端,比如Putty。在python的世界里,你可以使用原始套接字和一些加密函数创建自己的SSH客户端或服务端,但如果有现成的模块,为什么还要自己实现呢。使用Paramiko库中的PyCrypto能够让你轻松使用SSH2协议。

Paramiko的安装方法网上有很多这样的帖子,这里就不描述了。这里主要讲如何使用它。Paramiko实现SSH2不外乎从两个角度实现:SSH客户端与服务端。

首先让我们理清以下几个名词:

  • 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

下面给出几个常用的使用案例:

SSH客户端实现方案一,执行远程命令

这个方案直接使用SSHClient对象的exec_command()在服务端执行命令,下面是具体代码:

#实例化SSHClient
  client = paramiko.SSHClient()
  #自动添加策略,保存服务器的主机名和密钥信息
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  #连接SSH服务端,以用户名和密码进行认证
  client.connect(ip,username=user,password=passwd)
  #打开一个Channel并执行命令
  stdin,stdout,stderr = client.exec_command(command)
  #打印执行结果
  print stdout.readlines()
  #关闭SSHClient
  client.close()

SSH客户端实现方案二,执行远程命令

这个方案是将SSHClient建立连接的对象得到一个Transport对象,以Transport对象的exec_command()在服务端执行命令,下面是具体代码:

#实例化SSHClient
client = paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,username=user,password=passwd)
#实例化Transport,并建立会话Session
ssh_session = client.get_transport().open_session()
if ssh_session.active:
  ssh_session.exec_command(command)
  print ssh_session.recv(1024)
client.close()

SSH服务端的实现

实现SSH服务端必须继承ServerInterface,并实现里面相应的方法。具体代码如下:

import socket
import sys
import threading
import paramiko

host_key = paramiko.RSAKey(filename='private_key.key')

class Server(paramiko.ServerInterface):
  def __init__(self):
  #执行start_server()方法首先会触发Event,如果返回成功,is_active返回True
    self.event = threading.Event()

  #当is_active返回True,进入到认证阶段
  def check_auth_password(self, username, password):
    if (username == 'root') and (password == '123456'):
      return paramiko.AUTH_SUCCESSFUL
    return paramiko.AUTH_FAILED

  #当认证成功,client会请求打开一个Channel
  def check_channel_request(self, kind, chanid):
    if kind == 'session':
      return paramiko.OPEN_SUCCEEDED
#命令行接收ip与port
server = sys.argv[1]
ssh_port = int(sys.argv[2])

#建立socket
try:
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #TCP socket
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  sock.bind((server, ssh_port))  
  sock.listen(100)  
  print '[+] Listening for connection ...'
  client, addr = sock.accept()
except Exception, e:
  print '[-] Listen failed: ' + str(e)
  sys.exit(1)
print '[+] Got a connection!'

try:
  #用sock.accept()返回的socket实例化Transport
  bhSession = paramiko.Transport(client)
  #添加一个RSA密钥加密会话
  bhSession.add_server_key(host_key)
  server = Server()
  try:
  #启动SSH服务端
    bhSession.start_server(server=server)
  except paramiko.SSHException, x:
    print '[-] SSH negotiation failed'
  chan = bhSession.accept(20) 
  print '[+] Authenticated!'
  print chan.recv(1024)
  chan.send("Welcome to my ssh")
  while True:
    try:
      command = raw_input("Enter command:").strip("\n") 
      if command != 'exit':
        chan.send(command)
        print chan.recv(1024) + '\n'
      else:
        chan.send('exit')
        print 'exiting'
        bhSession.close()
        raise Exception('exit')
    except KeyboardInterrupt:
      bhSession.close()
except Exception, e:
  print '[-] Caught exception: ' + str(e)
  try:
    bhSession.close()
  except:
    pass
  sys.exit(1)

使用SFTP上传文件

import paramiko
#获取Transport实例
tran = paramiko.Transport(("host_ip",22))
#连接SSH服务端
tran.connect(username = "username", password = "password")
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
#设置上传的本地/远程文件路径
localpath="/root/Desktop/python/NewNC.py"
remotepath="/tmp/NewNC.py"
#执行上传动作
sftp.put(localpath,remotepath)

tran.close()

使用SFTP下载文件

import paramiko

#获取SSHClient实例
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端
client.connect("host_ip",username="username",password="password")
#获取Transport实例
tran = client.get_transport()
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

remotepath='/tmp/NewNC.py'
localpath='/root/Desktop/NewNC.py'

sftp.get(remotepath, localpath)

client.close()

总结

以上就是本文关于Python Paramiko模块的使用实际案例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
分享6个隐藏的python功能
Dec 07 Python
python实现简易云音乐播放器
Jan 04 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
django ORM之values和annotate使用详解
May 19 Python
keras slice layer 层实现方式
Jun 11 Python
python里glob模块知识点总结
Jan 05 Python
详解python3类型注释annotations实用案例
Jan 20 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 #Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 #Python
python通过elixir包操作mysql数据库实例代码
Jan 31 #Python
Django视图和URL配置详解
Jan 31 #Python
Python编程求质数实例代码
Jan 31 #Python
Python及Django框架生成二维码的方法分析
Jan 31 #Python
Python进阶之尾递归的用法实例
Jan 31 #Python
You might like
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
Js 刷新框架页的代码
2010/04/13 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
Python 元类使用说明
2009/12/18 Python
Django中处理出错页面的方法
2015/07/15 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
《第一朵杏花》教学反思
2014/04/16 职场文书
党员创先争优心得体会
2014/09/11 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
网络管理员岗位职责
2015/02/12 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
七年级上册生物的课件
2019/08/07 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python