我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python堡垒机实现之基础知识

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python堡垒机实现之基础知识

一般堡垒机都具有5个基本功能:

    1、权限控制

    2、执行命令

    3、上传下载文件

    4、远程登录

    5、记录操作


权限控制:

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

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

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

import MySQLdb

def con_mysql(mhost,muser,mpasswd,mdb):    #连接数据库需要的参数
   try:
      con = MySQLdb.connect(host=mhost,user=muser,passwd=mpasswd,db=mdb)
      cur = con.cursor()
   except MySQLdb.Error,err_msg:
      print 'Mysql Error Msg:',err_msg
      sys.exit()

   try:
      cur.execute('select * from host_list')    #执行SQL语句
      info = cur.fetchall()     #获取主机列表
      return info                #返回获取到的主机列表
   except MySQLdb.Error,err_msg:
      print 'Mysql Error Msg:',err_msg
      cur.close()
      con.close()
      sys.exit()

执行命令:

    说明:这里的执行命令一般是指批量执行命令,比如需要同时获取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.211',22,'test','123')
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.211',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()


以上只是关于堡垒机的一些功能的简单思路。实际应用过程中还需要在此基础上进行扩展。

博客的部分内容和思路整理自武沛齐的博客。

   

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python堡垒机实现之基础知识

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python堡垒机实现之基础知识

一般堡垒机都具有5个基本功能:    1、权限控制    2、执行命令    3、上传下载文件    4、远程登录    5、记录操作权限控制:    说明:根据不同的登录用户分配不同的可管理的主机组。(再细分的权限就是根据不同的用户控制可
2023-01-31

python之基础知识

1、变量:2、字符串:用   “  ” 或 ' ' 标注的。3、列表:[  ]4、del 和 pop 的区别:判断何时使用:当从列表中删除元素后不再使用,则del,若后续还使用则pop()例:#delname =["lele", "ning
2023-01-30

Python基础知识之2——字典

字典是什么?字典是另外一个可变的数据结构,且可存储任意类型对象,比如字符串、数字、列表等。字典是由关键字和值两部分组成,也就是 key 和 value,中间用冒号分隔。这种结构类似于新华字典,字典中每一个字都有一个对应的解释,具体的用法是这
2023-01-30

python基础知识小结之集合

集合 特点:集合对象是一组无序排列的可哈希的值:集合成员可以做字典的键,与列表和元组不同,集合无法通过数字进行索引。此外,集合中的元素不能重复。定义set() -> new empty set objectset(iterable) ->
2022-06-04

Python基础知识实例分析

这篇文章主要介绍了Python基础知识实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python基础知识实例分析文章都会有所收获,下面我们一起来看看吧。1、在Python 语言中,对象是通过引用传递的。
2023-06-17

Python 基础知识之字符串处理

Python字符串处理 字符串输入:my_string = raw_input("please input a word:")字符串判断: (1) 判断是不是纯字母my_string.isalpha()字符串搜索匹配: (1) rere正则
2022-06-04

Python基础之logging模块知识总结

目录前言一、日志级别二、basicConfig三、日志写文件四、traceback记录前言 logging模块是Python内置的标准模块,主要用于输出脚本运行日志,可以设置输出日志的等级、日志保存路径等。可以通过设置不同的日志等级,在 r
2022-06-02

万恶之源 - Python基础知识补充

编码转换编码回顾:  1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符.   没有中⽂, 8个01代码, 8个bit, 1个byte  2. GBK: 中⽂国标码, ⾥⾯包含了ASCII编码和中⽂常
2023-01-30

python基础知识之函数初阶——命名

python中的命名空间分三种:内置的命名空间,在启动解释器的时候自动加载进内存的各种名字所在的空间,比如print,input等不需要定义就可以使用的名字全局命名空间,就是从上到下所有我们定义的变量名和函数名所在的空间,是在程序从上到下被
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录