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()在服务端执行命令,下面是具体代码:

    #实例化SSHClientclient = 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()#关闭SSHClientclient.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 paramikohost_key = paramiko.RSAKey(filename='private_key.key')class Server(paramiko.ServerInterface):def __init__(self):#执行start_server()方法首先会触发Event,如果返回成功,is_active返回Trueself.event = threading.Event()#当is_active返回True,进入到认证阶段def check_auth_password(self, username, password):if (username == 'root') and (password == '123456'):return paramiko.AUTH_SUCCESSFULreturn paramiko.AUTH_FAILED#当认证成功,client会请求打开一个Channeldef 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 socketsock.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实例化TransportbhSession = 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:passsys.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模块的使用相关推荐

  1. python paramiko并发_使用Python paramiko模块利用多线程实现ssh并发执行操作

    1.paramiko概述 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以 ...

  2. python paramiko模块中设置执行命令超时值

    经常使用paramiko工具对几百台设备进行管理,但是由于服务器本身或是网络原因,有时返回值回不来,然后程序就看在那里一直等待,这个时候后需要设置一个超时值.paramiko模块中执行命令代码如下: ...

  3. python paramiko模块 远程上传目录文件

    目录 上传目录 上传文件 上传目录 python用paramiko模块默认中只可以上传文件,在网上也没有找到合适的直接上传目录的方法,所以用os.walk方法和paramiko结合写了一个上传目录的方 ...

  4. python paramiko模块

    paramiko模块 1. 介绍: paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的para ...

  5. python paramiko模块下载_Python自动化运维实战:使用Python管理网络设备

    现在,我们已经知道如何在不同的操作系统中使用和安装Python以及如何使用EVE-NG搭建网络拓扑.在本章中,我们将学习如何使用目前常用的网络自动化库自动完成各种网络任务.Python可以在不同的网络 ...

  6. python paramiko 模块简介(SSH2协议)

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  7. Python paramiko 模块详解与SSH主要功能模拟

    我们知道,通过SSH服务可以远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等,Python的paramiko模块同样实现了这一功能. 首先我们需要安装这一模块, ...

  8. Python paramiko模块基本使用(一)

    使用paramiko模块登录远程主机,对日志进行统计分析. import paramikodef batch_count(days, hours, ips, user, passwd, source_ ...

  9. 【代码】python paramiko模块代码示例:远程执行命令及上传和下载

    执行命令 - 通过用户名和密码连接服务器 #!/usr/bin/env python #coding:utf-8import paramikossh = paramiko.SSHClient() ss ...

最新文章

  1. 计算机视觉、图像分类、目标检测、人脸比对、人脸识别、语义分割、实例分割、图像搜索
  2. 规模-复杂世界的简单法则---熵
  3. bzoj1084: [SCOI2005]最大子矩阵
  4. LinuxShell脚本之利用rsync+ssh实现Linux文件系统远程备份
  5. 用于MCU,基于FreeRTOS的micro(轻量级)ROS
  6. mysql8 修改加密方式_mysql8修改密码加密方式
  7. Flink SQL 1.11 on Zeppelin 平台化实践
  8. golang协程——通道channel阻塞
  9. express怎么读取html,Express 配置HTML页面访问的实现
  10. Windows开发——内存读写API
  11. Command Line Tools下载不下来,则可以去官网下载
  12. 团队作业8----第二次项目冲刺(Beta阶段) 第五天
  13. 80211协议beacon帧字段解析一
  14. C#中操作Excel(4)—— 向Excel中插入两种图表以及设置图表格式
  15. 深信服 一面 2018 秋招
  16. mysql gh ost 对比_GitHub开源MySQL Online DDL工具gh-ost参数解析
  17. 从代码层面分析STM32 标准库和HAL库的差异
  18. 老派道场普陀山 海天佛国的禅修氛围
  19. Linux下开源打包工具fpm的安装与使用(超详细)
  20. NIST随机数测试软件下载,安装、和使用,分析方法最新版(19年4月)

热门文章

  1. 用html和css构建简单的静态网页
  2. 程序员必备神器:一款开源的不良坐姿监测应用 「PoseMon 让爷康康」
  3. mint-ui message box confirm弹框确认和取消按钮的回调
  4. 计算机ei浏览器没有了,ie浏览器不见了_我的电脑桌面上怎么IE浏览器没有了啊...
  5. 基于JavaWeb+MySQL的简历信息管理系统
  6. 微信小程序开发实战9_3 小程序URL Scheme
  7. 高数学习笔记(一):常用重要概念
  8. 【gitLab】gitLab新建项目步骤
  9. 使用Javascript的跨浏览器支持的图像偏斜效果
  10. 30岁的我应该何去何从