#!/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