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上传下载执行命令的更多相关文章

  1. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  2. python之实现ftp上传下载代码(含错误处理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...

  3. npm包上传下载的命令及例子

    npm包上传下载的命令及例子. 新建hello.js 执行:npm init 执行:npm adduser ( username:XXX password:XXX email:XXX ) 上传:npm ...

  4. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...

  5. Python接口自动化——文件上传/下载接口

    〇.前言 文件上传/下载接口与普通接口类似,但是有细微的区别. 如果需要发送文件到服务器,例如:上传文档.图片.视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: mul ...

  6. CentOS上传下载查看命令

    之前往CentOS中上传都用ftp软件,这里介绍一种另外的上传下载方式,两个命令轻松搞定.这两个命令目前只针对Xshell和SecureCRT等远程终端软件才支持,并且还会有时间的限制.大概30秒不上 ...

  7. 文件上传下载,命令之wget / curl / which / sort / uniq / cut / wc /tr /sed

    目录 命令 1.文件的上传下载 2.从外网下载文件wget 3.curl文件下载 4.查找命令which 5.字符处理命令-排序sort 6.字符处理-去重uniq 7.字符处理-截取cut 8.字符 ...

  8. rz、sz (上传下载)命令参数的解释

    $ man rz,查看帮助: -a, –ascii -b, –binary 用binary的方式上传下载,不解释字符为 ascii -e, –escape 强制escape 所有控制字符,比如 Ctr ...

  9. python脚本实现scp上传下载功能

    普通版本 1 # -*- coding:utf-8 -*- import paramiko,os,sys,time port = 22 user = 'root' def ssh_scp_put(ip ...

随机推荐

  1. Spring PropertyPlaceholderConfigurer 自定义扩展

    原文地址:https://blog.csdn.net/feiyu8607/article/details/8282893 Spring中PropertyPlaceholderConfigurer这个类 ...

  2. Docker安装MySQL集群【读写分离】

    Centos7系统Docker安装 目录 Centos7系统Docker安装 目录 Centos7系统Docker安装 1.下载mysql镜像 2.创建Master实例并启动 参数说明 3.创建Sla ...

  3. mysqli的基本使用

    简单实例 面向过程方式 // 创建数据库连接 $connect = mysqli_connect('127.0.0.1', 'root', 'root', 'test', 8889); // 判读是否 ...

  4. 云原生学习筑基 ~ 组网必备知识点 ~ DNS服务

    @ 目录 一.为啥写这篇文章? 二.DNS的作用 三.域 四.DNS工作原理 五.搭建DNS服务器 5.1.Bind 5.2.系统环境准备 5.3.安装 5.4.查看bind的相关文件 5.5.查看b ...

  5. jvm学习笔记:类加载过程

    类加载器子系统 类加载器的作用是加载class文件到内存 加载阶段->链接阶段->初始化阶段 ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断 加载的类信息 ...

  6. C# Dapper基本三层架构使用 (四、Web UI层)

    三层架构的好处,一套代码无论WinForm还是Web都可以通用,只写前台逻辑就可以了,现在展示Web调用三层的示例 首先在项目中创建一个Web MVC5项目,目前项目目录如下 在Web项目Web.co ...

  7. 浅谈KMP模式匹配算法

    普通的模式匹配算法(BF算法) 子串的定位操作通常称为模式匹配算法 假设有一个需求,需要我们从串"a b a b c a b c a c b a b"中,寻找内容为"a ...

  8. Elaticsearch基础概念

    概述 elaticsearch是一个分布式的搜索引擎,它可以实现各种复杂的数据类型实现近实时的搜索功能,无论是结构化还是非结构化的数据,都能使用elaticsearch存储并且可以快速搜索.elati ...

  9. open failed: EACCES (Permission denied)

    出现背景:调用系统相册进行图片展示,但是没有成功,是空白的,且检查权限无问题 解决方法

  10. C++课后习题

    一.设计一个类people,有保护数据成员:age(年龄,整型),name(姓名,string),行为成员:两个构造函数(一个默认,另一个带参数):析构函数:void setValue(int m, ...