python学习之路网络编程篇(第五篇)-续篇

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()

  

 

 

时间: 2024-10-11 22:42:13

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

《Python学习之路 -- 网络编程》

在前面已经提到过,互联网的本质就是一堆协议,协议就是标准,比如全世界人通信的标准是英语,所有的计算机都学会了互联网协议,那么所有的计算机就可以按照统一的标准去收发信息完成通信了. 作为普通开发人员的我们,写的软件/程序都是处于应用层上的,然而,想要让软件接入互联网,就必须得通过传输层,也就是必须遵循TCP协议或者UDP协议.这是两个非常复杂的协议,如果遵循原生的协议,那么必然会大大降低效率,所以就有了socket抽象层的概念.socket是应用层与TCP/IP协议族通信的软件抽象层,它是一组接口

python学习之路网络编程篇(第一篇)

新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = i print(name) #python中以函数为作用域 def func(): name = 'alex' print(name) #程序执行结果 # Traceback (most recent call last): # File "D:/PythonS13/Day10/С????1_pyt

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

paramiko简介 paramiko 是基于Python实现的SSH2远程安装连接,支持认证及秘钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能. paramiko安装 #!/bin/bash #install indepence package cd /data/soft wget https://www.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz yum -y install gcc python-devel

Python学习之路--网络编程

由于不同机器上的程序要通信,才产生了网络 C/S Client/Server 客户端/服务端 服务端 一直运行 等待服务别人 客户端 寻求服务的时候 才请求服务 B/S Browser/Server 浏览器/服务器 b/s架构是c/s架构的一种 实现通信上有全球唯一的MAC地址 网卡和网线 网卡 通过ip地址就能找到对应的MAC地址  ARP协议 交换机 ---- 多台机器之间的通信问题 广播风暴 网关  局域网中的机器想要访问局域网外的机器,需要通过网关访问 IP地址 和 子网掩码 按位与 

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

网络编程 网络编程需要知道的概念 1.网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. 网络(OSI)的7层模型: 应用层--->为应用程序提供网络通信服务 表示层--->数据表示 会话层--->主机间通信(两个应用进程间) 传输层--->端到端的连接,隔离网络的上下层协议,使得网络应用与下层协议无关 网络层--->寻找最优路径,转发数据包 数据链路层---&

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

一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二.网络编程 所谓网络编程就是通过某种计算机语言来实现不同设备间的资源共享和信息传递.计算机网络的创造比计算机本身的意义更大,否则我们现在还玩着单机游戏,也没有现在蒸蒸日上的互联网行业. 1.OSI模型 OSI模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架.OSI模型把网络通信的

python学习之路——第三弹 (作业篇第一题)

作业一:编写登录接口1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定. 所需知识点 文件基本读写操作,循环,列表,字典 上面的作业题是在学习完数据类型和简单的文件操作之后布置的,所以这个时间节点需要利用已有的知识完成. 作业一思路: 输入用户名密码----输入用raw_input--有个地方存储了用户名和密码,并且用户名密码一一对应--字典或者文件 输错三次后锁定--三次用循环--锁定用存储用户名的方式--列表,字典,文件 成功错误--判断 所以整体代码设计如下 : #/usr/b

Python学习笔记之网络编程

操作MySQL # 断言 assert(1==1) ############################################################################# ******************************************************************** # 创建Connection * ------------------------------------------------------------

Python学习之路3?编程风格

语句和语法 #   表示注释掉的内容 \    续行 1 print("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2 yyyyyyyyyyyyyyyyyyyyyyy") ;    分号:同一行放置多个语句以分号作为分割符 1 print('cyy');print('zzl') 2 3 输出结果: 4 cyy 5 zzl 语句(代码块)用缩进方式体现不同的代码级别,建议用4个空格(不要用tab) python文件以模块的方式组织,编写一个.py结尾的文件实际上