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 ...
随机推荐
- LeetCoded第739题题解--每日温度
每日温度 请根据每日 气温 列表,重新生成一个列表.对应位置的输出为:要想观测到更高的气温,至少需要等待的天数.如果气温在这之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temper ...
- 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?
JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...
- 【C语言】
第3章 最简单的C程序设计 顺序程序设计 数据的表现形式及其运算 常量.变量.常变量.标识符 数据类型 整型.浮点型 整型数据的分类 最基本的整型类型 基本整型(int型):占2个或4个字节 短整型( ...
- Kickstart无人值守原理及简介
原文转自:https://www.cnblogs.com/itzgr/p/10029461.html作者:木二 目录 一 简介及原理 二 搭建无人值守步骤 三 PXE介绍 四 Kickstart简介 ...
- 博观约取系列 ~ 探测Bert Finetune对向量空间的影响
熟悉NLP的同学对Bert Finetune一定不陌生,基本啥任务上来都可以Bert Finetune试一把.可是模型微调一定比直接使用预训练模型效果好么?微调究竟对Bert的向量空间产生了哪些影响嘞 ...
- K8S命令行工具——kubectl
1.kubectl概述 2.kubectl命令的语法 例子: 3.kubectl子命令使用分类 (1)基础命令 (2)部署和集群管理命令 (3)故障和调试命令 (4)其他命令 4.kubectl命令例 ...
- Mysql常用sql语句(6)- limit 限制查询结果的条数
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 实际工作中,我们的数据表数据肯定都是万级别的,如 ...
- 【第十八篇】- Maven Eclipse之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven Eclipse Eclipse 提供了一个很好的插件 m2eclipse ,该插件能将 Maven 和 Eclipse 集成在一起. 在最新的 Eclipse 中自带了 Maven,我们打 ...
- angularjs 文件上传
github连接地址:https://github.com/danialfarid/ng-file-upload 核心代码: html: <div class="form-group& ...
- 【转】Gitlab CI & Docker & Dockerfile & Docker-compose的博客文章
gitlab权限设置 GitLab功能系列报道-标签(Labels) Gitlab CI 使用高级技巧 docker-compose是个好东西,越用越香 基于docker-compose的Gitlab ...