python paramiko实现ssh上传下载执行命令
paramiko ssh上传下载执行命令
序言
最近项目经常需要动态在跳板机上登录服务器进行部署环境,且服务器比较多,每次完成所有服务器到环境部署执行耗费大量时间。为了解决这个问题,根据所学的执行实现了一个定时执行部署服务测试系统,其主要结构如下:

其中图中的这几个实现如下:
- 定时任务CI
 通过coding平台实现(https://codingcorp.coding.net/)
- 自定义节点
 通过coding平台添加自定义节点,目前是通过linux默认的default方式显示
- 部署命令/上传文件
 通过python的paramiko库实现
其中coding平台已提供ci能力来显示持续部署测试,想实现该功能只需通过python来实现文件上传以及执行命令功能
paramiko介绍
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。由于可通过python这种跨平台的语言运行,因此支持python平台(mac、linux、win)都能支持该功能。paramiko支持的功能很多,常用的功能如下:
- linux命令执行
- sftp协议执行
- 用户名/密码、DSSKey、ECDSAKey、Ed25519Key方式登录认证
paramiko安装简单,只需执行pip install paramiko即可
paramiko使用
使用paramiko发送命令的功能步骤如下:
- 创建一个SSH对象
 self.__ssh = paramiko.SSHClient()
- 允许连接不在know_hosts文件中的主机
 self.__ssh = paramiko.SSHClient()
- 连接服务器
 self.__ssh.connect(hostname=self.__ip,port=self.__port,username=self.__usename,password=self.__password,timeout=timeout)
- 发送命令
 stdin, stdout, stderr = self.__ssh.exec_command(cmd)
- 获取接收信息
 stdout.read().decode()
使用paramiko上传下载文件步骤如下:
- 使用ssh链接远程主机地址
 self.__sshfile = paramiko.Transport((self.__ip,self.__port))
- 设置登录用户名和密码
 self.__sshfile.connect(username=self.__usename, password=self.__password)
- 创建一个SFTP客户端通道
 self.__sftp = paramiko.SFTPClient.from_transport(self.__sshfile)
- 上传文件
 self.__sftp.put(local_path,server_path)
- 下载文件
 self.__sftp.get(server_path,local_path)
通过上述paramiko的使用,就能掌握该基本功能,后续我们可以通过封装的方式简化流程方便后续调用
paramiko封装
对于文件比较大的时候由于paramiko上传文件以及下载文件比较慢,可通过线程的方式防止阻塞,具体封装如下:
#coding:utf-8
import paramiko
import time
import threading
class Ssh(object):
    __ssh = ""
    __ip = ""
    __usename =""
    __password = ""
    __port = 22
    __sshfile = ""
    __sftp = ""
    __tload = ""
    __tdown = ""
    def __init__(self, ip,user='root', pwd='admin', port=22,timeout=5):
        try:
            self.__ip = ip
            self.__usename = user
            self.__password = pwd
            self.__port = port
            self.__ssh = paramiko.SSHClient()
            self.__ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.__ssh.connect(hostname=self.__ip,port=self.__port,username=self.__usename,password=self.__password,timeout=timeout)
            self.__sshfile = paramiko.Transport((self.__ip,self.__port))
            self.__sshfile.connect(username=self.__usename, password=self.__password)
            self.__sftp = paramiko.SFTPClient.from_transport(self.__sshfile)
        except Exception as  e:
            print("connect %s failed......"%self.__ip)
            self.__ssh.close()
            self.__sshfile.close()
            self.ssh_state = False
        return
    def sftp_upload_file(self,server_path,local_path):
        if self.ssh_state == False:
            return False
        try:
            #添加异步
            self.__tload = threading.Thread(target=self.__sftp.put,args=(local_path,server_path))
            # self.__tload.setDaemon(True)
            self.__tload.start()
        except Exception as e:
            print(e)
            return False
    def sftp_down_file(self,server_path,local_path):
        if self.ssh_state == False:
            return False
        try:
            #添加异步
            self.__tdown = threading.Thread(target=self.__sftp.get,args=(server_path, local_path))
            self.__tdown.start()
        except Exception as e:
            print(e)
            return False
    def send_command(self,cmd):
        if self.ssh_state == False:
            return False
        try:
            stdin, stdout, stderr = self.__ssh.exec_command(cmd)
            time.sleep(0.1)
        except Exception as e:
            return False
        return stdout.read().decode()
    def close(self):
        try:
            self.__tload.join()
            self.__tdown.join()
        except BaseException as e:
            print(e)
        self.__ssh.close()
        self.__sshfile.close()
    @property
    def ssh_state(self):
        return self.__ssh
    @ssh_state.setter
    def ssh_state(self,nstate):
        self.__ssh = nstate
调用如下
    ssh = Ssh(ip='0.0.0.0',user='root',pwd='12345678')
    print(ssh.send_command('ls'))
    ssh.sftp_down_file("/root/xu/iptablesadd.txt","C:/iptablesadd.txt")
    ssh.sftp_upload_file("/root/xu/iptablesadd11.txt","C:/xmind3790.rar")
    ssh.close()
python paramiko实现ssh上传下载执行命令的更多相关文章
- Python 基于Python实现Ftp文件上传,下载
		基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ... 
- python之实现ftp上传下载代码(含错误处理)
		# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ... 
- npm包上传下载的命令及例子
		npm包上传下载的命令及例子. 新建hello.js 执行:npm init 执行:npm adduser ( username:XXX password:XXX email:XXX ) 上传:npm ... 
- 初级版python登录验证,上传下载文件加MD5文件校验
		服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ... 
- Python接口自动化——文件上传/下载接口
		〇.前言 文件上传/下载接口与普通接口类似,但是有细微的区别. 如果需要发送文件到服务器,例如:上传文档.图片.视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: mul ... 
- CentOS上传下载查看命令
		之前往CentOS中上传都用ftp软件,这里介绍一种另外的上传下载方式,两个命令轻松搞定.这两个命令目前只针对Xshell和SecureCRT等远程终端软件才支持,并且还会有时间的限制.大概30秒不上 ... 
- 文件上传下载,命令之wget / curl / which / sort / uniq / cut / wc /tr /sed
		目录 命令 1.文件的上传下载 2.从外网下载文件wget 3.curl文件下载 4.查找命令which 5.字符处理命令-排序sort 6.字符处理-去重uniq 7.字符处理-截取cut 8.字符 ... 
- rz、sz (上传下载)命令参数的解释
		$ man rz,查看帮助: -a, –ascii -b, –binary 用binary的方式上传下载,不解释字符为 ascii -e, –escape 强制escape 所有控制字符,比如 Ctr ... 
- python脚本实现scp上传下载功能
		普通版本 1 # -*- coding:utf-8 -*- import paramiko,os,sys,time port = 22 user = 'root' def ssh_scp_put(ip ... 
随机推荐
- 关闭 Scroll Lock
			通常,在电子表格中选择一个单元格并按箭头键时,所选内容会在各个单元格之间上下左右移动,具体取决于您按的箭头键.但是,如果在 Scroll Lock 处于开启状态时按箭头键,则向上或向下滚动一行.或者, ... 
- yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:
			使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: 问题出现原因:yum包管理是使用python2 ... 
- 基于Vue+Vuex+Vue-Router+axios+mint-ui的移动端电商项目
			第一步:安装Node 1.打开NodeJS的官网,下载和自己系统相配的NodeJS的安装程序,包括32位还是64位一定要选择好,否则会出现安装问题. 下载地址:https://nodejs.org/e ... 
- 简单内存池的C实现
			1. 序言 对于程序开发人员来说,会经常听到这种"池"的概念,例如"进程池","线程池","内存池"等,虽然很多时没有吃 ... 
- vim编辑器设置
			由于ubantu自带的vi编辑器并不好用,而开发一般使用vim编辑器,vim需要自己安装(sudo apt-get install vim 即可安装),但是默认的设置使用起来很不舒服,因此可以通过修改 ... 
- K8S 简介
			K8S架构与组件 kubectl: 是一个客户端管理工具,直接管理API server,提供请求给API server,中间有auth认证.用户使用kubectl命令来请求API Server接口完成 ... 
- JS013. 重写toFixed( )方法,toFixed()原理 - 四舍五入?银行家舍入法?No!六舍七允许四舍五入√!
			以下为场景实测与原理分析,需要重写函数请直接滚动至页尾!!! 语法 - Number.prototype.toFixed( ) // toFixed()方法 使用定点表示法来格式化一个数值. numO ... 
- mybatis和hibernate区别
			一.本质区别和应用场景 
- sticky -- position定位属性sticky值之粘性定位;
			sticky简述 sticky 是css定为新增的属性:可以说是相对定位relative和固定定位fixed的结合: 它主要用在对scroll事件的监听上,简单说在滑动过程中,某个元素的距离其父元素的 ... 
- 【第十篇】- Git 远程仓库(Github)之Spring Cloud直播商城 b2b2c电子商务技术总结
			Git 远程仓库(Github) Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. 你就需要将数据 ... 
