#!/usr/bin/env python
# encoding: utf-8
#__author__ = 'cp'
#__date__ = '21/07/16 上午 10:32'
import threading
import time
import pexpect
import paramiko def copy_file(ip,username,pwd,source_file_name,dest_dir,
flag,result,*args,**kwargs):
#下发文件到目的主机 command='/usr/bin/scp %s %s@%s:%s'%(source_file_name,username,ip,dest_dir)
#print command
#print pwd
#print flag
try:
ssh = pexpect.spawn("%s"%(command),timeout=20)
i=ssh.expect(['password','continue connecting (yes/no)?'])
if i == 0:
ssh.sendline(pwd)
elif i == 1:
ssh.sendline('yes')
ssh.expect('password')
ssh.sendline(pwd)
res = ssh.readlines()
ssh.close()
print '执行结果:%s'%(ip)
print '--------------------------'
for i in res:
print i
result[ip]=flag except pexpect.TIMEOUT:
flag=False
result[ip]=flag
print '执行命令超时'
except Exception,e:
flag=False
result[ip]=flag
print 'error: %s'%(e) def remote_exec_command(ip,username,pwd,command,
result,flag,port=22,*args,**kwargs):
# 远程执行系统命令
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, port, username, pwd)
stdin, stdout, stderr = ssh.exec_command(command)
# stdin.write('Y')
res = stdout.readlines()
ssh.close() print '%s:'%(ip)
print '----------------------'
for i in res:
print i
result[ip] = flag
except Exception, e:
flag = False
result[ip]=flag
print e class myThread(threading.Thread):
def __init__(self,name,username,password,action,flag,result,
source_file_name=None,dest_dir=None,cmd=None,
*args,**kwargs):
threading.Thread.__init__(self)
self.result=result
self.name= name
self.username=username
self.password=password
self.action=action
self.flag=flag
self.cmd=cmd
self.source_file_name=source_file_name
self.dest_dir=dest_dir def run(self):
if self.action == 1:
copy_file(ip=self.name,username=self.username,pwd=self.password,
source_file_name=self.source_file_name,
dest_dir=self.dest_dir,
flag=self.flag,
result=self.result) elif self.action == 0:
remote_exec_command(ip=self.name,username=self.username,pwd=self.password,
command=self.cmd,
flag=self.flag,
result=self.result) if __name__ == '__main__':
result={} #目的主机执行结果flag存储
username='admin' #系统用户名
password='test123123' #系统密码
source_file_name='/tmp/toc/test.tar.gz' #要下发的文件名(必须为绝对路径+文件名)
dest_dir='/tmp' #下发到目的主机上的文件存放路径
action=0 #控制整个程序是下发文件还是执行命令
# 0:代表远程执行命令
# 1:代表下发文件
flag=True #标记是否执行成功,如果执行失败flag=False cmd='echo $PATH && free -m' #要远程执行的命令 ips=['192.168.100.175','192.168.100.172'] #要管理的主机IP的列表
for ip in ips:
thread_ip = myThread(name=ip,username=username,password=password,
action=action,cmd=cmd,flag=flag,result=result,
source_file_name=source_file_name,dest_dir=dest_dir)
thread_ip.start() count = threading.activeCount() #当前系统的线程数
num = count -1
if action == 1:
while True:
if len(result) == num:
#print result
print '-'*30
for k,v in result.items():
if v:
print '文件远程下发成功:%s'%(k)
else:
print '文件远程下发失败:%s'%(k)
break
else:
time.sleep(0.5)
continue
elif action == 0:
while True:
if len(result) == num:
#print result
print '-'*30
for k,v in result.items():
if v:
print '命令\'%s\'执行成功:%s'%(cmd,k)
else:
print '命令%s执失败:%s' % (cmd, k)
break
else:
time.sleep(0.5)
continue

说明:

  由action控制程序是下发文件还是执行命令(0:远程执行命令; 1:下发文件到远程主机上)

  分别利用了pexpect模块和paramiko模块完成和系统的交互

结果:

当action的值为0时

192.168.100.172:
----------------------
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

total       used       free     shared    buffers     cached

Mem:          7872       6719       1152          0        186       2473

-/+ buffers/cache:       4059       3813

Swap:        16383        450      15933

192.168.100.175:
----------------------
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

total       used       free     shared    buffers     cached

Mem:          7872       7676        196         16        186       3796

-/+ buffers/cache:       3692       4179

Swap:         4031        187       3844

------------------------------
命令'echo $PATH && free -m'执行成功:192.168.100.175
命令'echo $PATH && free -m'执行成功:192.168.100.172

当action的值为1时:

执行结果:192.168.100.172
--------------------------
:

test.tar.gz                                   100%   10MB 682.7KB/s   00:15

执行结果:192.168.100.175
--------------------------
:

test.tar.gz                                   100%   10MB 682.7KB/s   00:15

------------------------------
文件远程下发成功:192.168.100.175
文件远程下发成功:192.168.100.172

Pyhton 利用threading远程下发文件和远程执行linux系统命令的更多相关文章

  1. linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录

    最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都 ...

  2. 使用paramiko远程执行命令、下发文件

    写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...

  3. 利用Socket远程发送文件

    思想: 1.注意使用两个通道,一个普通对象通信通道,另一个纯净的文件字节流通道 2.利用通信通道发送文件请求,新建字节流通道,开始发送文件

  4. 办公室的远程传文件 的命令三种方式linux

    不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是 ...

  5. 利用java实现可远程执行linux命令的小工具

    在linux的脚本中,如果不对机器做其他的处理,不能实现在linux的机器上执行命令.为了解决这个问题,写了个小工具来解决这个问题. 后面的代码是利用java实现的可远程执行linux命令的小工具,代 ...

  6. CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析

    [CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110)    Microsoft Wi ...

  7. ftp获取远程Pdf文件

    此程序需要安装ftp服务器,安装adobe reader(我这里使用的adobe reader9.0) 1.部署ftp服务器 将ftp的权限设置为允许匿名访问,部署完成 2.安装adobe reade ...

  8. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  9. 对来自于Azure的远程连接文件(.rdp)的另一种更便捷的自定义方法

    在上一篇日志中(很抱歉那张比较黑的截图)介绍了如何获得Azure中的Windows虚拟机的远程连接文件,以及一种基于文本编辑方式进行自定义的方法. 实际上对于在Windows下的用户来说,我们可以使用 ...

随机推荐

  1. Shell scripts to Create a local dir base on the time.

    #!/bin/bash DATETIME=`date +%Y%m%d%H%M%S` echo "datetime = $DATETIME" mkdir $DATETIME # cd ...

  2. IE浏览器下一些图片无法显示的(在其他非ie浏览器能够显示)解决办法

    因为要完成本学期老师布置得网页作业,做完的时候进行网页的兼容性测试,chrome和360都没有问题. ie下却有两个图片无法显示. 一般这种情况代码是没有什么问题的,一般是图片本身的问题, 当我用Ps ...

  3. WindowManager massge和handler

    在一个可移动浮动按钮的demo源码学习中,有一些WindowManager的使用,在此做下总结. 1.翻译过来就是窗口管理,是和应用框架层的窗口管理器交互的接口,通过 mWindowManager = ...

  4. window下xampp配置多端口、多站点步骤

    好些日子没整理知识了,许多新东西不整理出来时间一长就淡忘了.看来以后得继续坚持整理. 配置XAMPP多端口.多站点如下步骤: 多端口: (一个域名下同时配置多个端口,从而达到访问不同程序) 效果例如: ...

  5. Junit测试框架 Tips

    关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...

  6. Matlab读取数据中出现的问题

    在运行Matlab读取一段数据并做处理的时候,常常会提示服务器错误,但是等待一会再次运行就会成功运行. 代码如下: clc; clear all; [~,~,rawdata] = xlsread('进 ...

  7. CentOS安装配置redis

    安装前准备,安装gcc 先用 gcc -v命令检测本机是否安装gcc,如果没有则用下面命令安装: yum install cpp yum install binutils yum install gl ...

  8. browsersync实现网页实时刷新(修改LESS,JS,HTML时)

    var gulp = require("gulp"), less = require("gulp-less"), browserSync = require(& ...

  9. webstorm2016注册码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  10. dot

    今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...