转载请注明出处,欢迎提出宝贵意见,谢谢!

功能介绍:

1、主机分组
  登录后显示分组主机及主机数量
  选择主机组后显示该主机组下所有主机信息,主机名及IP
显示输入选择:
1、执行命令
利用线程并发组内所有主机同时执行命令,并将结果,返回
格式为:
----------------------host1------------------

----------------------host2------------------

----------------------host3------------------

----------------------host4------------------

2、传输文件

主函数:

#Author by Guangboli
#_*_ coding:utf-8 _*_ import configparser,threading,paramiko,time,os,sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
from core import Color_set
color = Color_set.Colorset()
cf = configparser.ConfigParser()
cf.read('config',encoding='utf-8')
secs = cf.sections()
def get_group_info():
'''获取主机组信息'''
print("主机组列表:")
for i in secs:
opts = cf.options(i)
quantity = int(len(opts) / 4)
print(i,'[%s]'%quantity)
def get_host_ip_list(group_name,quantity):
'''获取主机ip列表信息'''
i = 1
while i <= quantity:
print(cf.get(group_name,'ip%s'%i))
i+=1
def cmd_run(ip,username,password,cmd): ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=ip, port=22, username=username, password=password)
stdin, stdout, stderr = ssh.exec_command(cmd) # 执行命令,不可执行类似vim,top watch命令
result = stdout.read().decode() # 获取结果
tips = color.red('- - - - - %s - - - - - - '.center(20) % ip)
print(tips)
print(result,stderr.read().decode())
except Exception as e:
print('%s 主机发生异常:'%ip,e)
ssh.close()
def transport_put_file(ip,username,password,cmd):
try:
transport = paramiko.Transport((ip, 22))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_file,remote_dir+'/'+put_filename)
except Exception as e:
print(print('%s 主机发生异常:'%ip,e))
transport.close()
def transport_get_file(ip,username,password,cmd):
transport = paramiko.Transport((ip, 22))
try:
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.get(remote_file,local_dir+'\\'+ip+'-'+get_filename) #Linux 需要将\\改为/
except Exception as e:
print(print('%s 主机发生异常:'%ip,e))
transport.close()
def make_treading(func,quantity,group_name,cmd):
i = 1
while i <= quantity:
ip = cf.get(group_name, 'ip%s' % i)
username = cf.get(group_name, 'username%s' % i)
password = cf.get(group_name, 'password%s' % i)
thread = threading.Thread(target=func,args=(ip,username,password,cmd))
thread.setDaemon(True)
thread.start()
i+=1
def welcome():
'''show group and host ip information '''
get_group_info()
global opts,quantity,group_name
while True:
group_name = input('请输入组名(退出请按q or Q):').strip().upper()
if group_name == 'Q':
print('欢迎再次使用,谢谢....')
exit()
elif group_name not in secs:
print("Wrong input,please confirm!")
else:
break
print(group_name,'组下的主机:')
opts = cf.options(group_name)
quantity = int(len(opts) / 4) #hosts quantity
get_host_ip_list(group_name,quantity)
def menu_line2():
global local_dir,local_file,remote_file,remote_dir,get_filename,put_filename
print('''usage:
上传文件:put 本地文件 远程目录
下载文件:get 远程文件 本地目录
退出输入q or Q
examples:
put test.txt /tmp
get /tmp/test.txt /data
''')
while True:
cmd = input("请输入操作:").strip()
args = cmd.split()
if cmd == 'q' or cmd == 'Q':
menu_line1() elif len(args) != 3:
print("输入有误,请重新输入!")
menu_line2()
else:
if args[0] == 'put':
local_file = args[1]
put_filename=args[1].split('/')[-1]
remote_dir = args[2]
func = transport_put_file
make_treading(func, quantity, group_name, cmd)
while threading.active_count() != 1:
time.sleep(0.1)
else:
continue
elif args[0] == 'get':
remote_file = args[1]
get_filename = args[1].split('/')[-1]
local_dir = args[2]
func = transport_get_file
make_treading(func, quantity, group_name, cmd)
while threading.active_count() != 1:
time.sleep(0.1)
else:
continue
else:
print("输入格式有误,请重新输入!")
menu_line2()
def menu_line1():
'''commadns menu'''
func = cmd_run
while True:
print('1、执行命令\n2、传输文件\n')
choice = input("请选择操作:").strip()
if choice == '':
cmd = input("请输入命令:").strip()
print('%s 命令执行结果如下:' % cmd)
make_treading(func,quantity,group_name,cmd)
while threading.active_count() != 1:
# print(threading.active_count())
time.sleep(0.1)
else:
continue
elif choice == '':
menu_line2()
elif choice == 'q' or choice == 'Q':
welcome()
else:
continue
def run():
'''
main function
'''
print('welcome.....')
welcome()
menu_line1() if __name__ == '__main__':
run()

config文件:

[GROUP1]
host1 = host1
ip1 = 10.1.2.3
username1 = root
password1 = 123456
host2 = host2
ip2 = 10.1.2.2
username2 = user1
password2 = 123456
host3 = host3
ip3 = 10.1.2.7
username3 = user2
password3 = 123456 [GROUP2]
host1 = host1
ip1 = 10.1.2.1
username1 = root
password1 = 123456
host2 = host2
ip2 = 10.1.2.2
username2 = root
password2 = 123456
host3 = host3
ip3 = 10.1.2.3
username3 = root
password3 = 123456 [GROUP3]
host1 = host1
ip1 = 10.1.2.1
username1 = root
password1 = 123456
host2 = host2
ip2 = 10.1.2.2
username2 = root
password2 = 123456
host3 = host3
ip3 = 10.1.2.3
username3 = root
password3 = 123456
host4 = host4
ip4 = 10.1.2.4
username4 = root
password4 = 123456
host5 = host5
ip5 = 10.1.2.5
username5 = root
password5 = 123456 [GROUP4]
host1 = host1
ip1 = 10.1.2.1
username1 = root
password1 = 123456
host2 = host2
ip2 = 10.1.2.2
username2 = root
password2 = 123456
host3 = host3
ip3 = 10.1.2.3
username3 = root
password3 = 123456
host4 = host4
ip4 = 10.1.2.4
username4 = root
password4 = 123456
host5 = host5
ip5 = 10.1.2.5
username5 = root
password5 = 123456
host6 = host6
ip6 = 10.1.2.6
username6 = root
password6 = 123456
host7 = host7
ip7 = 10.1.2.7
username7 = root
password7 = 123456

目录结果:

python3 实现堡垒机功能(并发执行命令及上传下载文件)的更多相关文章

  1. 批量执行(Linux命令,上传/下载文件)

    前言: 每个公司的网络环境大都划分 办公网络.线上网络,之所以划分的主要原因是为了保证线上操作安全: 对于外部用户而言也只能访问线上网络的特定开放端口,那么是什么控制了用户访问线上网络的呢? 防火墙过 ...

  2. 【liunx命令】上传下载文件的方法

    scp   帮助命令: man scp   scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择.   从远程主机 下载东西到 本地电脑 ...

  3. centos/redhat命令行上传下载文件

    前言:客户端上没有安装xftp,winscp等等软件,无法将服务器上需要的文件下载到本地去解析,无法将本地的安装包上传到服务器上去,这个时候命令行就可以带你翱翔一波 配置如下: 服务器上: 1.安装需 ...

  4. 【Python】模块学习之使用paramiko连接Linux,远程执行命令,上传下载、文件

    本文主要介绍paramiko远程执行linux命令,及在服务器上进行文件的上传.下载 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. ...

  5. SSH命令行上传/下载文件

    上传:scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载:scp user(远端用户名)@host( ...

  6. ARTS-S mac终端ftp命令行上传下载文件

    上传 ftp -u ftp://root:123456@10.11.12.3/a.txt a.txt 下载 ftp -o a.txt ftp://root:123456@10.11.12.13/a.t ...

  7. Linux 使用命令行上传下载文件

    基本语法: 服务器: 用户名@ip:/路径 scp 要拷贝的文件 要存放的文件 上传文件到服务器 # 把本地 source.md 文件上传到 152.116.113.13 服务器的/home目录 # ...

  8. python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)

     -*-          paramiko.util.log_to_file(         ssh = paramiko.SSHClient()          ssh.set_missing ...

  9. python批量操作Linux服务器脚本,key登录(执行命令、上传、下载)(二)

       -*-   2 #批量操作linux服务器(执行命令,上传,下载)   3 #!/usr/bin/python   4 import paramiko   5 import datetime   ...

随机推荐

  1. grep正则表达式(二)

    任意字符(The Any Character) dot or period character: "." grep -h '.zip' dirlist*.txt ".&q ...

  2. hdu 5868:Different Circle Permutation 【Polya计数】

    似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...

  3. 【NLP新闻-2013.06.03】New Book Where Humans Meet Machines

    英语原文地址:http://nlp.hivefire.com/articles/share/39865/ 注:本人翻译NLP新闻只为学习专业英语和扩展视野,如果翻译的不好,请谅解! (我挺想看这本书的 ...

  4. 【JVM】JVM参数

    JVM参数的含义  参数名称 含义 默认值   -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆 ...

  5. CGContextRef 使用小记

    . 用CGContextRef 画文字 在 UIView的 - (void)drawRect:(CGRect)rect {} 方法中进行 CGContextRef context = UIGraphi ...

  6. exists 的简单介绍

    准备数据: CREATE TABLE Books( BookID number, BookTitle VARCHAR2(20) NOT NULL, Copyright varchar2(20) ) I ...

  7. 【LeetCode 57】插入区间

    题目链接 [题解] 这题要分四种情况. 第一种.区间在所有区间的前面. 第二种.区间在所有区间的后面. 第三种.区间在某两个区间之间但是没有交集. 第四种.区间和某个区间产生了相交. 对于第四种枚举第 ...

  8. Oracle or Question Solve(二)

    数据库常用语句和函数 ----update update()函数主要注意的是后面的where限制条件--例子:update tab_a a set a.v1 = (select b.v1 from t ...

  9. [BZOJ3379] Turning in Homework

    中文题目:提交作业 原文题目:Turning in Homework 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3379 哎,今天竟然没有 ...

  10. MySQL常用的一些语句,索引,字段等

    1.库相关:建库:character set:指定编码COLLATE:排序规则 utf8mb4_general_ci 大小写不敏感CREATE DATABASE `test_db` default c ...