Pyhton 利用threading远程下发文件和远程执行linux系统命令
#!/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系统命令的更多相关文章
- linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录
最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都 ...
- 使用paramiko远程执行命令、下发文件
写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...
- 利用Socket远程发送文件
思想: 1.注意使用两个通道,一个普通对象通信通道,另一个纯净的文件字节流通道 2.利用通信通道发送文件请求,新建字节流通道,开始发送文件
- 办公室的远程传文件 的命令三种方式linux
不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是 ...
- 利用java实现可远程执行linux命令的小工具
在linux的脚本中,如果不对机器做其他的处理,不能实现在linux的机器上执行命令.为了解决这个问题,写了个小工具来解决这个问题. 后面的代码是利用java实现的可远程执行linux命令的小工具,代 ...
- CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析
[CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110) Microsoft Wi ...
- ftp获取远程Pdf文件
此程序需要安装ftp服务器,安装adobe reader(我这里使用的adobe reader9.0) 1.部署ftp服务器 将ftp的权限设置为允许匿名访问,部署完成 2.安装adobe reade ...
- Linux主机上实现树莓派的交叉编译及文件传输,远程登陆
0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...
- 对来自于Azure的远程连接文件(.rdp)的另一种更便捷的自定义方法
在上一篇日志中(很抱歉那张比较黑的截图)介绍了如何获得Azure中的Windows虚拟机的远程连接文件,以及一种基于文本编辑方式进行自定义的方法. 实际上对于在Windows下的用户来说,我们可以使用 ...
随机推荐
- startssl申请配置免费https证书
之前给业务配置都是在沃通上申请免费证书,而后通过反向代理层的Nginx进行https认证. 今天来了个新需求,要求域名直接解析至阿里云SLB.https配置需要通过阿里云的控制台部署这倒无所谓,只是在 ...
- python基础05 if选择
摘要:if语句是用来检查一个条件,如果条件为真(true),我们运行一个语句块(称为IF块),否则(else)运行另一个语句块(else块).else语句是可选的 程序1(将文件保存为if.py): ...
- PS特效精粹
冲击有力的广告效果 神奇画笔功能 + 强大的图层样式 Photoshop中的三维特效
- java的基础知识运算符
一.运算符. 1.算数运算符:+,-,*,/,% 2.自增自减 :++ ,-- ++在前 先运算在赋值 ++在后 先赋值后运算 -- 减减同上. 3.赋值运算符 : = ,+=,-=,*=,/= 4. ...
- oracle连接问题【转载】
SQL的四种连接-左外连接.右外连接.内连接.全连接 今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的,导致平时的数据记录要进行一些限制性处理,其实也可以设置视图 ...
- Banner插件版
条件:使用JQ. 使用情况:当目标元素调用该插件时,插件产生的元素会替换该目标元素,并且在目标元素位置生成.需要输入一组图片地址数组(对象还没有实现,慢慢改善)默认宽高是600*400,可在后面的参数 ...
- 线性分式变换(linear fractional transformation)
线性分式变换(linear fractional transformation)的名称来源于其定义的形式:(ax+b)/(cx+d),其中分子分母是线性的,然后最外层是一个分式形式,所以叫做这个名字, ...
- <十>JDBC_处理Blob类型数据
/* * 读取BLOB数据: * 使用getBlob方法读取到Blob对象 * 调用Blob的getBinaryStream(方法得到输入流,在使用IO操作 * */ @Test publ ...
- liunx常用的命令
计算机网络的主要优点是能够实现资源和信息的共享,并且用户可以远程访问信息.Linux提供了一组强有力的网络命令来为用户服务,这些工具能够帮助用户登录到远程计算机上.传输文件和执行远程命令等. 本章介绍 ...
- 后台PageVo中字段赋值与前台datagrid字段获取
后台PageVo中字段的geter与setter函数需根据pageVo的字段自动生成,前台字段与后台字段名保持一致. 数据返回到前台时,datagrid会根据字段名隐射到相应的getter与sette ...