源代码:

环境需求:

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 多线程批量执行指令及批量上传文件和目录相关推荐

  1. python运维实战--跨堡垒机连接二级服务器上传文件

    python运维实战--跨堡垒机连接二级服务器上传文件 paramiko的有关概念和操作 Welcome to Paramiko! - Paramiko documentation 这个python脚 ...

  2. python 自动点击上传以后上传文件,python使用selenium模拟点击网页实现自动导入上传文件功能...

    一.环境准备 Python版本:3.4 编辑器:Pycharm excel文件:导入的excel模板 二.python代码 由于工作需要,需要每天定时导入相关excel文件进入后台数据库,由于导入的逻 ...

  3. Python使用阿里云对象存储OSS--服务器端上传文件

    一直在使用阿里云对象存储Oss,今天来总结一下基本用法,主要写个逻辑,具体操作都有详细的文档,会附链接 1  开通服务 首先需要开通oss服务以及创建存储空间,需要注意的是开通完oss服务之后默认的是 ...

  4. python 判断文件类型_python接口自动化(三十) 上传文件时自动判断文件类型(filetype)...

    前言 如何判断一个文件的类型呢,判断这个文件是png还是jpg,还是MP3文件?filetype包是python用来判断文件类型的依赖包,github地址:https://github.com/h2n ...

  5. python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...

    一.UPD Socket 编程 socket 对象中与UDP Socket 服务器编程有关的方法是bind() ,注意不需要listen() 和accept() , 这是因为UDP 通信不需要像TCP ...

  6. POI批量导入及一键上传ocupload和pinyin4j组件的使用案例

    主要讲解四点: 快递员批量作废功能(重点,本质上是快递员的批量修改操作) 一键上传.POI解析Excel.pinyin4j(会用) 代码重构:优化模型驱动和优化分页代码(理解) 定区添加.带条件分页查 ...

  7. python paramiko并发_python学习笔记9--paramiko模块、多线程、锁机制

    一.paramiko模块 paramiko模块是一个遵循ssh2协议的python扩展模块,该模块可以允许使用python通过ssh协议去远程管理主机.在使用该模块前,需要手动安装,具体安装过程请百度 ...

  8. python paramiko安装_Python Paramiko模块的安装与使用详解

    一.前言 常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了.而使用paramiko可 ...

  9. python paramiko使用_python paramiko 模块使用方法

    pythonparamiko paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令.项目地址:https://gith ...

最新文章

  1. 我与我的专业计算机作文500字,我的好朋友——电脑
  2. Loadrunner 性能测试服务器监控指标
  3. c语言实现循环单链表
  4. AmazonSQS和Spring用于消息传递队列
  5. kmeans算法学习2
  6. 当relative遇上z-index,半透明度不阻断事件捕获
  7. 14个阿里高管的研发管理实践和思考 | 凌云时刻
  8. C语言程序设计教程(第三版)课后习题8.2
  9. 安装element ui
  10. oracle odac 客户端 区别,ODAC使用指南 (一)ODAC常见问题集
  11. 如何使用SPSS判断数据的正态分布
  12. movsw 汇编_【汇编】 常用代码段 rep movsw/rep movsw
  13. 数据分析之 AB测试(AB Test)
  14. 痛与教训,我所亲历的3个失败游戏创业公司
  15. win10右键没有新建笔记本
  16. echarts的学习(六)调色盘的学习
  17. 花花的森林(倍增,LCA
  18. oracle 行级死锁_解决Oracle数据库死锁
  19. jquery概要--基础01
  20. STC15L2K32S2芯片介绍与实验板原理图分析

热门文章

  1. 量化交易很好,但是也存在问题
  2. Python3 爬虫(一)-- 简单网页抓取
  3. android xml 焦点,android TV 焦点选中放大效果
  4. linux串口进单用户模式,进入SUSE Linux Enterprise Server 12系统单用户模式的方法
  5. 控制台怎么查看错误的详细信息_js错误处理,quot;try..catchquot;
  6. 图片放大不失真软件 S-Spline V2
  7. 如何防止网页被Demo
  8. 哪吒汽车宣布获得上海银行总行20亿元综合授信额度
  9. 下班搜包被诉 苹果支付近3000万美元与加州门店员工和解
  10. 消息称苹果正探索更大尺寸iPad 屏幕分别为14英寸、16英寸