python paramiko并发_python paramiko 多线程批量执行指令及批量上传文件和目录
源代码:
环境需求:
1、python3
2、paramiko
pip install --upgrade pip
apt-get install libssl-dev
pip3 install paramiko
3、执行权限
chmod +x becmd.py
ln -s /root/be/bin/becmd.py /usr/local/sbin/becmd
chmod +x besync.py
ln -s /root/be/bin/becmd.py /usr/local/sbin/besync
4、导入路径设置
cd /usr/lib/python3.5/dist-packages/
touch be.pth
vim be.pth
/root/be #be.pth文件内容
5、因为是从windows开发所以会出现以下问题:
windows 上传的文件,可以用这个指令格式化成Unix文件。
apt install dos2unix
[email protected]:~/be/bin# ./besync.py
/usr/bin/env: ‘python3\r’: No such file or directory
[email protected]:~/be/bin# dos2unix besync.py
dos2unix: converting file besync.py to Unix format ...
[email protected]:~/be/bin# ./besync.py
Reminder: The source and destination addresses do not exist
Usage: ./besync.py
解决
apt install dos2unix
dos2unix becmd.py
dos2unix besync.py
6、日志路径的问题。最好是绝对路径,不然只能在be目录下执行becmd 和besync
f = open("/root/be/logs/besync.log",‘a‘)
f = open("/root/be/logs/becmd.log",‘a‘)
程序目录:
.
├── app
│ ├── __init__.py
│ ├── pwd_connect_cmd.py
│ ├── pwd_connect_sync.py
│ ├── __pycache__
│ │ ├── __init__.cpython-35.pyc
│ │ ├── pwd_connect_cmd.cpython-35.pyc
│ │ ├── pwd_connect_sync.cpython-35.pyc
│ │ ├── ssh_be_cmd.cpython-35.pyc
│ │ └── ssh_be_sync.cpython-35.pyc
│ ├── ssh_be_cmd.py
│ └── ssh_be_sync.py
├── bin
│ ├── becmd.py
│ ├── besync.py
│ └── __init__.py
├── conf
│ ├── config.py
│ ├── __init__.py
│ └── __pycache__
│ ├── config.cpython-35.pyc
│ └── __init__.cpython-35.pyc
├── __init__.py
└── logs
├── becmd.log
├── besync.log
└── __init__.py
app/ssh_be_cmd.pyimport paramiko
import threading
import datetime
class MyThread(threading.Thread):
def __init__(self,ip,port,username,password,cmd):
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
super(MyThread,self).__init__()
self.ip = ip
self.port = port
self.username = username
self.password = password
self.cmd = cmd
def run(self):
port = int(self.port)
self.ssh.connect(hostname=self.ip, port=port, username=self.username, password=self.password)
stdin, stdout, stderr = self.ssh.exec_command(self.cmd)
res, err = stdout.read(), stderr.read()
result = res if res else err
f = open("/root/be/logs/becmd.log",‘a‘)
f.write(str(datetime.datetime.now())+" ")
f.write(self.ip+" ")
f.write(self.username+ " ")
f.write(self.cmd+ "\n")
f.close()
print("\033[1;32;40m" + self.ip.rjust(33,‘=‘)+ "\033[0m","\033[1;32;40m" + "Command result: ".ljust(37,‘=‘)+ "\033[0m")
print(result.decode())
self.ssh.close()
app/pwd_connect_cmd.pyimport sys
from app.ssh_be_cmd import MyThread
from conf.config import account
def pwd_con(host):
ip = account[host]["ip"]
port = account[host]["port"]
username = account[host]["username"]
password = account[host]["password"]
a=sys.argv[1:100]
cmd = " ".join(a)
if len(a) >=1:
M = MyThread(ip,port,username,password,cmd)
M.start()
else:
print("Reminder: The command does not exist")
exit()
def connect():
for host in account.keys():
pwd_con(host)
app/ssh_be_sync.pyimport paramiko
import threading
import datetime,time
import os
from os.path import getsize
class MyThread(threading.Thread):
def __init__(self,ip,port,username,password,cmd):
super(MyThread,self).__init__()
self.ip = ip
self.port = port
self.username = username
self.password = password
self.cmd = cmd
def run(self):
port = int(self.port)
self.transport = paramiko.Transport((self.ip, port))
self.transport.connect(username=self.username, password=self.password)
self.sftp = paramiko.SFTPClient.from_transport(self.transport)
help="""
-f send file to remote host.
%s -f
-d send dir to remote host.
%s -d
--help show help.
%s --help
"""%(self.cmd[0],self.cmd[0],self.cmd[0])
def create_remote_dir(dir):
for item in dir:
try:
self.sftp.stat(item)
pass
except FileNotFoundError:
print("Create a new directory: ", item)
self.sftp.mkdir(item)
def besync_log():
f = open("/root/be/logs/besync.log",‘a‘)
for i in str(datetime.datetime.now())+" ",self.ip+" ",self.username+ " ",self.cmd[0]+" ",self.cmd[1]+" ",src+" ",des+ "\n":
f.write(i)
f.close()
if len(self.cmd) == 4 and self.cmd[1] == "-f":
src = self.cmd[2]
des = self.cmd[3]
besync_log()
time_start = time.time()
if os.path.isfile(src):
des_list = des.split("/")
des_dir = des_list[1:-1]
b=""
c=[]
for item in des_dir:
b+="/"+item
c.append(b)
create_remote_dir(c)
self.sftp.put(src, des)
total_time = time.time() - time_start
print("\033[1;32;40mSend Successful.\033[0m")
print("total size: " + str(getsize(src)) + " bytes")
print("total time: " + str(total_time))
self.transport.close()
elif len(self.cmd) == 4 and self.cmd[1] == "-d":
def for_dir():
for res in path:
if os.path.isdir(res):
local_dir_path.append(res)
remote_dir_path.append(des)
def for_zdir():
des_src_dir.append(remote_dir_path[1])
des_src_dir_list = des_src_dir[0].split("/")
des_dir_list = des_src_dir_list[1:]
c = ""
remote_des_src_path = []
for item in des_dir_list:
c += "/" + item
remote_des_src_path.append(c)
create_remote_dir(remote_des_src_path)
create_remote_dir(remote_dir_path)
for res in path:
if os.path.isfile(res):
local_file_path.append(res)
src = self.cmd[2]
des = self.cmd[3]
besync_log()
sep = "/"
path = []
local_dir_path = []
local_file_path = []
remote_dir_path = []
remote_file_path = []
des_src_dir = []
for i in os.listdir(src):
path.append(src + sep + i)
for n in path:
if os.path.isdir(n) and os.listdir(n):
for i in os.listdir(n):
path.append(n + sep + i)
local_dir_path.append(src)
local_dir = src.split("/")
local_dir_first = local_dir[0:-1]
global a
if len(local_dir_first) == 0:
for_dir()
for res in local_dir_path:
remote_dir_path.append(des + "/" + res)
for_zdir()
for res in local_file_path:
remote_file_path.append(des + "/" + res)
else:
if len(local_dir_first) ==1:
dir_join="/".join(local_dir_first)
a=dir_join
else:
dir_join="/".join(local_dir_first)
a=dir_join+"/"
for res in path:
if os.path.isdir(res):
local_dir_path.append(res)
remote_dir_path.append(des)
b=[item.split(a)[-1] for item in local_dir_path]
for res in b:
if len(local_dir_first) ==1:
remote_dir_path.append(des + res)
else:
remote_dir_path.append(des + "/" + res)
for_zdir()
d = [item.split(a)[-1] for item in local_file_path]
for res in d:
if len(local_dir_first) ==1:
remote_file_path.append(des + res)
else:
remote_file_path.append(des + "/" + res)
time_start = time.time()
local_file_num = len(local_file_path)
for i in range(local_file_num):
self.sftp.put(local_file_path[i],remote_file_path[i])
total_time = time.time() - time_start
print("\033[1;32;40mSend Successful.\033[0m")
print("total time: " + str(total_time))
self.transport.close()
else:
print(help)
app/pwd_connect_sync.pyimport sys
from app.ssh_be_sync import MyThread
from conf.config import account
def pwd_con(host):
ip = account[host]["ip"]
port = account[host]["port"]
username = account[host]["username"]
password = account[host]["password"]
cmd=sys.argv[0:100]
M = MyThread(ip, port, username, password, cmd)
M.start()
def connect():
for host in account.keys():
pwd_con(host)
conf/config.pyaccount = {
"192.168.1.57":{
"ip":"192.168.1.57",
"port":"22",
"username":"root",
"password":"123456"
},
"192.168.1.75":{
"ip": "192.168.1.75",
"port": "22",
"username": "root",
"password": "123456"
}
}
bin/becmd.py#!/usr/bin/env python3
from app.pwd_connect_cmd import connect
connect()
bin/besync.py#!/usr/bin/env python3
from app.pwd_connect_sync import connect
connect()
使用例子:
1、批量执行指令:
2、批量上传文件
3、批量上传目录
本文出自 “微风清凉” 博客,谢绝转载!
原文:http://jiay1.blog.51cto.com/9144615/1933721
python paramiko并发_python paramiko 多线程批量执行指令及批量上传文件和目录相关推荐
- python运维实战--跨堡垒机连接二级服务器上传文件
python运维实战--跨堡垒机连接二级服务器上传文件 paramiko的有关概念和操作 Welcome to Paramiko! - Paramiko documentation 这个python脚 ...
- python 自动点击上传以后上传文件,python使用selenium模拟点击网页实现自动导入上传文件功能...
一.环境准备 Python版本:3.4 编辑器:Pycharm excel文件:导入的excel模板 二.python代码 由于工作需要,需要每天定时导入相关excel文件进入后台数据库,由于导入的逻 ...
- Python使用阿里云对象存储OSS--服务器端上传文件
一直在使用阿里云对象存储Oss,今天来总结一下基本用法,主要写个逻辑,具体操作都有详细的文档,会附链接 1 开通服务 首先需要开通oss服务以及创建存储空间,需要注意的是开通完oss服务之后默认的是 ...
- python 判断文件类型_python接口自动化(三十) 上传文件时自动判断文件类型(filetype)...
前言 如何判断一个文件的类型呢,判断这个文件是png还是jpg,还是MP3文件?filetype包是python用来判断文件类型的依赖包,github地址:https://github.com/h2n ...
- python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...
一.UPD Socket 编程 socket 对象中与UDP Socket 服务器编程有关的方法是bind() ,注意不需要listen() 和accept() , 这是因为UDP 通信不需要像TCP ...
- POI批量导入及一键上传ocupload和pinyin4j组件的使用案例
主要讲解四点: 快递员批量作废功能(重点,本质上是快递员的批量修改操作) 一键上传.POI解析Excel.pinyin4j(会用) 代码重构:优化模型驱动和优化分页代码(理解) 定区添加.带条件分页查 ...
- python paramiko并发_python学习笔记9--paramiko模块、多线程、锁机制
一.paramiko模块 paramiko模块是一个遵循ssh2协议的python扩展模块,该模块可以允许使用python通过ssh协议去远程管理主机.在使用该模块前,需要手动安装,具体安装过程请百度 ...
- python paramiko安装_Python Paramiko模块的安装与使用详解
一.前言 常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了.而使用paramiko可 ...
- python paramiko使用_python paramiko 模块使用方法
pythonparamiko paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令.项目地址:https://gith ...
最新文章
- 我与我的专业计算机作文500字,我的好朋友——电脑
- Loadrunner 性能测试服务器监控指标
- c语言实现循环单链表
- AmazonSQS和Spring用于消息传递队列
- kmeans算法学习2
- 当relative遇上z-index,半透明度不阻断事件捕获
- 14个阿里高管的研发管理实践和思考 | 凌云时刻
- C语言程序设计教程(第三版)课后习题8.2
- 安装element ui
- oracle odac 客户端 区别,ODAC使用指南 (一)ODAC常见问题集
- 如何使用SPSS判断数据的正态分布
- movsw 汇编_【汇编】 常用代码段 rep movsw/rep movsw
- 数据分析之 AB测试(AB Test)
- 痛与教训,我所亲历的3个失败游戏创业公司
- win10右键没有新建笔记本
- echarts的学习(六)调色盘的学习
- 花花的森林(倍增,LCA
- oracle 行级死锁_解决Oracle数据库死锁
- jquery概要--基础01
- STC15L2K32S2芯片介绍与实验板原理图分析
热门文章
- 量化交易很好,但是也存在问题
- Python3 爬虫(一)-- 简单网页抓取
- android xml 焦点,android TV 焦点选中放大效果
- linux串口进单用户模式,进入SUSE Linux Enterprise Server 12系统单用户模式的方法
- 控制台怎么查看错误的详细信息_js错误处理,quot;try..catchquot;
- 图片放大不失真软件 S-Spline V2
- 如何防止网页被Demo
- 哪吒汽车宣布获得上海银行总行20亿元综合授信额度
- 下班搜包被诉 苹果支付近3000万美元与加州门店员工和解
- 消息称苹果正探索更大尺寸iPad 屏幕分别为14英寸、16英寸