#!/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. Android端简易蓝牙聊天通讯App(原创)

    欢迎转载,但请注明出处!谢谢.http://www.cnblogs.com/weizhxa/p/5792775.html 最近公司在做一个蓝牙串口通讯的App,有一个固定的蓝牙设备,需要实现手机连接相 ...

  2. 第二天 ci执行流程

    第二天 ci执行流程 welcome 页面 this this->load 单入口框架index.php 两个文件夹 system application定义 定义常亮路径 载入 codeign ...

  3. Android Handler消息传递机制

    在Android系统中,类Handler主要有如下两个作用. 在新启动的线程中发送消息. 在主线程中获取.处理消息. 类Handler在实现上述作用时,首先在新启动的线程中发送消息,然后在主线程中获取 ...

  4. HTTP 使用期及新鲜度算法

    使用期算法: /* * age_value 当代理服务器用自己的头部去响应请求时,Age标明实体产生到现在多长时间了. * date_value HTTP 服务器应答中的Date字段 原始服务器 * ...

  5. VS2013开启滚动条缩略图和双击选中高亮,效果杠杠滴!

    1.双击代码或选中代码高亮,用以下插件,反应很灵敏,我安装的是第三个 2.代码编辑器的滚动条缩略图是VS自带的,需要打开菜单----工具----选项,如下图设置: 3.VS默认的选中颜色,需要打开菜单 ...

  6. [XAML]类似WPF绑定的Binding的读取方法

    在WPF的XAML里,依赖属性可以使用基于BindingBase之类的MarkupExtensin 读取XAML时,会自动的把该BindingBase转换为BindingExpressionBase ...

  7. Ajax完整篇(转载)

    Ajax 完整教程 第 1 页 Ajax 简介Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用 ...

  8. Array方法

    1.concat()方法 用法:用于连接两个或者多个数组. 对原数组有无影响:不会改变原有数组,会返回一个连接之后的数组. 2.join()方法 用法:以指定的分隔符把数组中每一项拆分成字符串. 对原 ...

  9. Docker学习笔记第一章:补充

    只记得学习后面的命令,忘记整理一些概念性的东西了,只能做个补充了=.= Docker虽然也是一种虚拟技术,但是不同于虚拟机的概念.Docker是一种以容器为主的技术,容器运行不需要模拟层(emulat ...

  10. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...