您的位置:首页 > 编程语言 > Python开发

用Python多线程和paramiko给主机组批量分发命令和传送文件

2016-08-23 16:30 489 查看
需求:
1、用Python的多线程对主机组批量分发命令
2、需要有传送文件的功能
3、把输出的日志信息写到日志文件(包括正确输出日志,和错误输出日志,包含日志写入的时间)

准备工作:
1、把需要远程控制分发命令的机器(被控端)配置好ssh+key2、下载第三方模块包
pycrypto-2.6.tar.gz http://pan.baidu.com/s/1dFHSvcP
paramiko-1.10.1.tar.gz http://pan.baidu.com/s/1hrWzg7y

在控制服务器端编译安装第三方模块包:
[root@test1 opt]# yum install gcc python-devel
[root@test1 opt]# tar xf pycrypto-2.6.1.tar.gz
[root@test1  opt]# cd pycrypto-2.6.1
[root@test1 pycrypto-2.6]# python setup.py build
[root@test1 pycrypto-2.6]# python setup.py install
[root@test1 pycrypto-2.6]# cd ..
[root@test1 opt]# tar xf paramiko-1.10.1.tar.gz
[root@test1 opt]# cd paramiko-1.10.1
[root@test1 paramiko-1.10.1]# python setup.py build
[root@test1 paramiko-1.10.1]# python setup.py install


脚本内容:
[root@test1 opt]# cat issue_comm.py
#!/usr/bin/env python
#coding:utf-8
import threading
import paramiko
import time
import sys

while True:
try:
time.sleep(3)
comd = raw_input('请输入你要批量分发的命令(输入1传送文件):')
except:
sys.exit()

else:
#哪果输入为exit就退出系统
if comd == 'exit':
sys.exit()

if comd == '1':
try:
yuan = raw_input('请输入你源服务器文件文件的路径,如/opt/test.txt:')
mb = raw_input('请输入你目标服务器存放文件的路径:如/opt/test1.txt:')
except:
sys.exit()

#定义IP最后一位的初始值
num = 9

#日志文件
succ = '/opt/log.txt'
err = '/opt/error.txt'

def run(n):

#输入Key的路径
private_key_path = '/root/.ssh/id_rsa'

#获得key
key = paramiko.RSAKey.from_private_key_file(private_key_path)

#获取连接ssh方法
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#把局部变量设为全局变量
global num
global yuan
global mb
if comd == '1':

#加锁
samp.acquire()

#三台机器的IP地址
num += 1
ip='192.168.200.%s' %num
t = paramiko.Transport((ip,22))
t.connect(username='root',pkey=key)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(yuan,mb)
t.close()

#解锁
samp.release()

else:
#加锁
samp.acquire()

#三台机器的IP地址
num += 1
ip='192.168.200.%s' %num

##连接相关信息
ssh.connect(hostname=ip, port=22, username='root', pkey=key)

#执行命令
stdin, stdout, stderr = ssh.exec_command(comd)

#获取执行命令的时间
sj = time.strftime('%Y-%m-%d %H:%M:%S')

#打开正确和错误日志文件
f = open(succ,'ab')
e = open(err,'ab')

#读进正确和错误信息
result_out = stdout.read()
result_err = stderr.read()

#把正确和错误信息写到日志文件
if result_err:
e.write(sj+'\n')
e.write(result_err+'\n')
e.close
else:
f.write(sj+'\n')
f.write(result_out+'\n')
f.close

#输出正确和错误信息
print result_out
print result_err

#关闭ssh连接
ssh.close();

#解锁
samp.release()

#最大同时执行的线程数为3
samp = threading.BoundedSemaphore(3)

#创建三个线程
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=run,args=(i,))

#启动多线程
t.start()


目录展示:




执行脚本展示:




错误命令输入:




再次查看当前目录:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐