Python堡垒机实现之基础知识

一般的堡垒机必须要具备以下5个基本功能:

  1、权限控制
2、执行命令
3、上传下载文件
4、远程登录
5、记录操作

权限控制

说明:根据不同的登录用户分配不同的可管理的主机组。(再细分的权限就是根据不同的用户控制可在主机上执行的命令,一般不会限制的这么严格)

思路:使用数据库创建用户表,表字段有ID、用户名、密码、所属组,再创建主机表,表字段有ID,主机IP,所属组。其中用户表中的所属组和主机表中的所属组相对应,这样就能把两张表关联起来。当用户登录的时候就可以根据用户名去获取可管理的主机列表。

例子:这里只写出关于python连接mysql数据库的例子

执行命令:

说明:这里的执行命令一般是指批量执行命令,比如需要同时获取N台主机的主机名。

思路:使用paramiko模块来实现远程登录服务器并执行命令。使用multiprocessing来实现批量并发执行。

例子:(这里只写出paramiko模块远程密码登录服务器并执行命令的例子)

import paramiko

class Paramiko_Manage():
def __init__(self,host,port,user,passwd): #初始化连接服务器所需要的参数
self.host = host
self.port = port
self.user = user
self.passwd = passwd #使用密码认证 def connect(self): #连接方法,用来建立与服务器的连接
self.transport = paramiko.Transport((self.host,self.port))
self.transport.connect(username=self.user,password=self.passwd)
print('connect') def close(self): #关闭方法,用来关闭与服务器的连接
self.transport.close()
print('close') def cmd(self,command): #执行命令的方法,接收需要执行的命令作为参数
ssh = paramiko.SSHClient()
ssh._transport = self.transport
stdin, stdout, stderr = ssh.exec_command(command,timeout=3)
print('command resluat: ',stdout.read()) def run(self,command):
self.connect() #建立连接
self.cmd(command) #执行命令
self.close() #关闭连接 p = Paramiko_Manage('192.168.100.20',22,'test','123456')
p.run('hostname') # 执行结果:
# connect
# command resluat: Test1
#
# close

上传、下载文件:

说明:批量上传文件相对比较简单,如果是批量下载文件还需要考虑到多台服务器文件重名的问题。

还需要考虑到文件上传后比较大小以确认是否上传下载成功。

思路:使用paramiko模块来实现远程上传下载文件。使用multiprocessing来实现批量并发执行。

例子:(这里只写出paramiko模块远程秘钥认证登录服务器并执行命令的例子)

import paramiko
import os class Paramiko_Manage():
def __init__(self,host,port,user,key):
self.host = host
self.port = port
self.user = user
keyfile = os.path.expanduser(key) #使用秘钥认证
self.key = paramiko.RSAKey.from_private_key_file(keyfile) def connect(self):
self.transport = paramiko.Transport((self.host,self.port))
self.transport.connect(username=self.user,pkey=self.key)
print('connect') def close(self):
self.transport.close()
print('close') def trans(self,file1,file2): #传输文件的方法
sftp = paramiko.SFTPClient.from_transport(self.transport)
file1 = '%s_%s' % (file1, self.host) #修改下载文件的保存文件名
sftp.get(file2,file1)
file1_size = os.path.getsize(file1) #获取下载文件的大小
file2_size = int(str(sftp.stat(file2)).split()[4]) #获取远程文件的大小
if file1_size == file2_size: #比较两个文件大小
print('File trans done') def run(self,file1,file2):
self.connect() #建立连接
self.trans(file1,file2) #传输文件
self.close() #关闭连接 p = Paramiko_Manage('192.168.100.20',22,'test2','~/.ssh/id_rsa')
p.run('/root/hosts','/etc/hosts') # 执行结果:
# connect
# File trans done
# close

远程登录和记录操作:

说明:通过堡垒机ssh远程连接到服务器,并执行操作,和在终端执行操作的效果一样。

思路:使用paramiko实现远程连接服务器的功能,使用sys.stdin和select处理用户输入和接受返回结果。

例子:

import paramiko
import select
import sys
import socket
import os tran = paramiko.Transport((host,port)) #连接服务器,host和port自定义
tran.start_client()
default_path = os.path.join(os.environ['HOME'],'.ssh','id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('root',key)
chan = tran.open_session() #打开一个通道
chan.get_pty() #获取一个终端
chan.invoke_shell() #激活器 f = open('log.log','a') #打开一个文件用于写入执行的操作
while True:
# 监视用户输入和服务器返回数据
# sys.stdin 处理用户输入
# chan 是之前创建的通道,用于接收服务器返回信息
readable,writeable,error = select.select([chan,sys.stdin,],[],[],1)
if chan in readable: #接受命令的返回结果
try:
x = chan.recv(1024)
if len(x) == 0:
print('\r\n*** EOF\r\n',)
f.close() #退出时关闭记录文件
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in readable: #处理用户输入发送到服务器执行
inp = sys.stdin.readline()
f.write(inp) #记录用户输入
chan.sendall(inp) chan.close()
tran.close()

  

 

 

python学习之路网络编程篇(第五篇)-续篇的更多相关文章

  1. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

  2. python学习之路网络编程篇(第二篇)

    新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = ...

  3. python学习之路网络编程篇(第一篇)socket初识

    什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为socket.socket通常也称为“套接字”,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的 ...

  4. python学习之路网络编程篇(第五篇)

    paramiko简介 paramiko 是基于Python实现的SSH2远程安装连接,支持认证及秘钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能. paramiko安装 #!/bin/b ...

  5. python学习之路网络编程篇(第四篇)- 续

    Memcache简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...

  6. python学习之路网络编程篇(第三篇)

    python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  7. python学习笔记11 ----网络编程

    网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...

  8. python学习笔记10 ----网络编程

    网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...

  9. Python学习之==>Socket网络编程

    一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二 ...

随机推荐

  1. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

  2. Orm之中介模型

    什么是中介模型 中介模型针对的是ManyToMany(多对多)的时候第三张表的问题, 中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就 ...

  3. hive-jdbc获取查询日志慢的问题发现与解决

    1.问题描述: 数据平台的临时查询一直有一个问题,就是日志获取太慢了,每次都是和结果一块出来的,这就非常影响用户的体验,半天都没任何输出.另一个是Beeline客户端不一致,beeline客户端每次都 ...

  4. Python系列之 - 装饰器

    装饰器主要是用来对函数的操作,我们把定义的函数比作一个蛋糕的话,那么装饰器就是盒子,如果要吃蛋糕就先打开盒子.具体到程序中就是在函数外层又套了一层,套的那一层就是一个装饰器.这么说可能有点抽象,那么我 ...

  5. [转]scrapy中的logging

    logging模块是Python提供的自己的程序日志记录模块. 在大型软件使用过程中,出现的错误有时候很难进行重现,因此需要通过分析日志来确认错误位置,这也是写程序时要使用日志的最重要的原因. scr ...

  6. 典型分布式系统分析之MapReduce

    在 <分布式学习最佳实践:从分布式系统的特征开始(附思维导图)>一文中,提到学习分布式系统的一个好方法是思考分布式系统要解决的问题,有哪些衡量标准,为了解决这些问题:提出了哪些理论.协议. ...

  7. JS实现手机访问pc网址自动跳转到wap网站

    之前写pc端直接跳转wap端一直是后端java写的,跟js一样都是根据navigator.userAgent来判断设备是电脑还是手机的,我知道这种前端也可已完成的功能,只是后台比较强势,本人本着以和为 ...

  8. [LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树

    Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...

  9. [LeetCode] Optimal Division 最优分隔

    Given a list of positive integers, the adjacent integers will perform the float division. For exampl ...

  10. WKWebView和WebView与JS的交互方式

    UIWebView与JS的交互方式 一,OC调用JS直接调用苹果提供的API - (nullable NSString *)stringByEvaluatingJavaScriptFromString ...