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设置windows桌面壁纸的实现代码
Jan 28 Python
在Python上基于Markov链生成伪随机文本的教程
Apr 17 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Python3 处理JSON的实例详解
Oct 29 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
对python中dict和json的区别详解
Dec 18 Python
python交换两个变量的值方法
Jan 12 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
python中eval与int的区别浅析
Aug 11 Python
python是否适合网页编程详解
Oct 04 Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 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
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
Python 函数返回值的示例代码
2019/03/11 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
升国旗仪式主持词
2014/03/19 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
如何用python插入独创性声明
2021/03/31 Python
mysql 排序失效
2022/05/20 MySQL