1.配置文件host.conf
[webserver]
host1=192.168.1.10,root,123456,22
host2=192.168.1.11,root,123456,22
[dbserver]
db1=192.168.1.12,root,123456,22
db2=192.168.1.13,root,123456,22
2.ssh远程命令脚本ssh.py
#!/usr/bin/python
# --*-- coding: utf-8 --*--
import paramiko
import os, sys
import configparser
from multiprocessing import Process, Lock
from optparse import OptionParser #解析命令行参数
"""
命令行格式如下:
python.exe ssh.py -H host1,host2 -G webserver,dbserver -C "free -m" # -C 后面命令必须双引号
python.exe ssh.py -H host1,host2 -C "df -Th"
python.exe ssh.py -G webserver,dbserver -C "ls -l"
"""
#加载解析配置文件
home_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
conf_file = home_dir + '\\conf\\cmd.conf'
config = configparser.ConfigParser()
config.read(conf_file)
host1_info = config.get('webserver', 'host1').split(',')
host2_info = config.get('webserver', 'host2').split(',')
db1_info = config.get('dbserver', 'db1').split(',')
db2_info = config.get('dbserver', 'db2').split(',')
sections_list = config.sections()
#print(config.options('dbserver'))
host_dict = {'host1': host1_info, 'host2': host2_info, 'db1': db1_info, 'db2': db2_info}
class MyProcess(Process):
def __init__(self, hostname, username, password, cmd, name, lock):
super().__init__()
self.hostname = hostname
self.username = username
self.password = password
self.cmd = cmd
self.name = name
self.lock = lock
def run(self):
with self.lock:
try:
ssh = paramiko.SSHClient()
# ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) # 不使用密钥认证
ssh.connect(hostname=self.hostname, username=self.username, password=self.password)
stdin, stdout, stderr = ssh.exec_command(self.cmd) # 执行远程命令
print('%s 主机开始执行命令%s' % (self.name,self.cmd))
print(stdout.read().decode('utf-8'))
ssh.close()
print('%s主机执行结束\n' %self.name)
except Exception as e:
print(e)
def cmd_parser():
"""命令行解析"""
parser = OptionParser()
parser.add_option("-H", "--host", dest="host", help="执行远程命令的主机")
parser.add_option("-G", "--group", dest="group", help="执行远程命令的主机组")
parser.add_option("-C", "--command", dest="command", help="需要执行的远程命令")
(options, _) = parser.parse_args()
hosts = []
if options.host:
temp_hosts = options.host.split(',')
for i in temp_hosts:
if i in host_dict:
hosts.append(i)
groups = []
if options.group:
temp_groups = options.group.split(',')
if temp_groups:
for i in temp_groups:
if i in sections_list:
groups.append(i)
temp_group_list = []
if groups:
for i in groups:
temp_group_list += config.options(i)
if options.command:
cmd = options.command
else:
print('命令不存在,退出程序')
sys.exit(1)
return (hosts, temp_group_list, cmd)
if __name__ == '__main__':
lock = Lock()
cmd_tuple = cmd_parser()
hosts = cmd_tuple[0]
groups = cmd_tuple[1]
cmd = cmd_tuple[2]
#print(cmd_tuple)
p_l = []
if hosts:
for host in hosts:
p = MyProcess(host_dict[host][0],host_dict[host][1],host_dict[host][2],cmd,host,lock)
p.daemon = True
p.start()
p_l.append(p)
if groups:
for host in groups:
p1 = MyProcess(host_dict[host][0],host_dict[host][1],host_dict[host][2],cmd,host,lock)
p.daemon = True
p1.start()
p_l.append(p1)
for i in p_l:
i.join()
print("所有进程执行结束")
sftp上传下载文件脚本
#!/usr/bin/python
# --*-- coding: utf-8 --*--
import paramiko
import os, sys
import configparser
from optparse import OptionParser
from multiprocessing import Process,Lock
"""
命令行格式:
本地是windows主机路径,远端是linux主机路径
上传文件执行格式
python.exe sftp.py -H host1,host2 -G webserver,dbserver -a put -l E:\python\oldboyday9\homework\bin\hyh.txt -r /home/kkjr/hyh.txt
python.exe sftp.py -H host1,host2 -a put -l E:\python\oldboyday9\homework\bin\hyh.txt -r /home/kkjr/hyh.txt
python.exe sftp.py -G webserver,dbserver -a put -l E:\python\oldboyday9\homework\bin\hyh.txt -r /home/kkjr/hyh.txt
下载文件执行命令
python.exe sftp.py -H host1 -a get -l E:\python\oldboyday9\homework\bin\hyh.txt -r /home/kkjr/hyh.txt
"""
bin_dir = os.path.dirname(os.path.abspath(__file__)) #上传下载文件存放目录设置成bin目录
#加载解析配置文件
home_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
conf_file = home_dir + '\\conf\\cmd.conf'
config = configparser.ConfigParser()
config.read(conf_file)
host1_info = config.get('webserver', 'host1').split(',')
host2_info = config.get('webserver', 'host2').split(',')
db1_info = config.get('dbserver', 'db1').split(',')
db2_info = config.get('dbserver', 'db2').split(',')
sections_list = config.sections()
#print(config.options('dbserver'))
host_dict = {'host1': host1_info, 'host2': host2_info, 'db1': db1_info, 'db2': db2_info}
class MyProcess(Process):
def __init__(self, hostname, username, password, port, cmd, localpath, remotepath):
super().__init__()
self.hostname = hostname
self.username = username
self.password = password
self.port = int(port)
self.cmd = cmd
self.localpath = localpath
self.remotepath = remotepath
def run(self):
"""上传下载文件"""
try:
t = paramiko.Transport((self.hostname, self.port))
t.connect(username=self.username, password=self.password)
sftp = paramiko.SFTPClient.from_transport(t)
if self.cmd == 'put':
sftp.put(self.localpath, self.remotepath)
elif self.cmd == 'get':
sftp.get(self.remotepath, self.localpath)
else:
print('命令不存在')
sys.exit(1)
except Exception as e:
print(e)
def cmd_parser():
"""命令行解析"""
parser = OptionParser()
parser.add_option("-H", "--host", dest="host", help="执行远程命令的主机")
parser.add_option("-G", "--group", dest="group", help="执行远程命令的主机组")
parser.add_option("-a", "--action", dest="action", help="上传下载文件参数设置")
parser.add_option("-l", "--local", dest="local", help="本地文件路径参数设置")
parser.add_option("-r", "--remote", dest="remote", help="ftp服务器文件路径参数设置")
(options, _) = parser.parse_args()
#print(options.host,options.group,options.action,options.local,options.remote)
hosts = []
if options.host:
temp_hosts = options.host.split(',')
for i in temp_hosts:
if i in host_dict:
hosts.append(i)
groups = []
if options.group:
temp_groups = options.group.split(',')
if temp_groups:
for i in temp_groups:
if i in sections_list:
groups.append(i)
temp_group_list = []
if groups:
for i in groups:
temp_group_list += config.options(i)
if options.action and options.local and options.remote:
cmd = options.action
localpath = options.local
remotepath = options.remote
else:
print('命令不存在,退出程序')
sys.exit(1)
return (hosts, temp_group_list, cmd, localpath, remotepath)
if __name__ == '__main__':
cmd_tuple = cmd_parser()
hosts = cmd_tuple[0]
groups = cmd_tuple[1]
cmd = cmd_tuple[2]
localpath = cmd_tuple[3]
remotepath = cmd_tuple[4]
p_l = []
if hosts:
for host in hosts:
p = MyProcess(host_dict[host][0],host_dict[host][1],host_dict[host][2],host_dict[host][3],cmd,localpath,remotepath)
p.daemon = True
p.start()
p_l.append(p)
if groups:
for host in groups:
p1 = MyProcess(host_dict[host][0],host_dict[host][1],host_dict[host][2],host_dict[host][3],cmd,localpath,remotepath)
p1.daemon = True
p1.start()
p_l.append(p1)
for i in p_l:
i.join()
print("所有进程执行结束")
转载于:https://blog.51cto.com/haoyonghui/1943188