第二部分用户交互程序开发,通过paramiko记录ssh会话记录
需求及任务:实现一个给用户登录的界面(通过ssh登到堡垒机上,然后给它展现一个命令行的页面,然后他选择登哪台机器,一选择就连上去且把日志也记录下来)。
先在admin创建几条组数据并与用户关联如下图:

一.用户交互程序开发
分析:等用户一连上我的堡垒机就启动我的程序,我这个程序是脚本的形式,脚本界面,跟用户交互,让它去连。
真正交互的程序我把放在manage.py同级的bakend包下---我专放所有后端程序。
(1)和manage.py同级目录新建crazyeye_manager.py---这是程序的入口:
导入backend中的main模块并实例化我在main.py中自定的ArgvHandler(object)"""接收用户参数,并调用相应的功能"""的类,并且直接传入参数后此实例就自己调用相应参数--我在main.py中自定的call方法。
import sys,os if __name__ == "__main__":
#让脚本能访问django数据库环境需要如下三条命令:
##设置环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "s3CrazyEye.settings")
#把django相关联的app都加载一遍
import django
django.setup() from backend import main #导入
interactive_obj = main.ArgvHandler(sys.argv)#交互程序可能需要很多参数
interactive_obj.call() #调用call方法
(2)backend/main.py:
argvhandler类(接收用户参数,并调用相应的功能)--只负责处理/调用参数即它只是一个入口
help_msg方法(打印帮助):列出可用功能如提示run方法就是启动用户交互程序
call方法(根据用户参数,调用对应的方法)
run方法(启动用户交互程序)
class ArgvHandler(object):
"""接收用户参数,并调用相应的功能"""
def __init__(self,sys_args):#初始化类
self.sys_args = sys_args #给类传sys_args参数
def help_msg(self,error_msg=''):
"""打印帮助"""
msgs = """
%s
run 此方法启动用户交互程序
""" % error_msg exit(msgs)
def call(self):
"""根据用户参数,调用对应的方法"""
if len(self.sys_args) == 1: #如果等于1则代表什么也没输
self.help_msg()
#让call法后面跟的第一个参数就是run函数名
if hasattr(self,self.sys_args[1]):#如果类参数中有run方法则拿到此方法并调用执行它(1就是方法,因为0是此脚本本身)
func = getattr(self,self.sys_args[1])
func()
else:
self.help_msg("没有方法:%s"% self.sys_args[1]) def run(self):
"""启动用户交互程序"""
from backend.ssh_interactive import SshHandler
obj = SshHandler(self) #把自己传给这个类方法
obj.interactive() #启动交互脚本
(3)backend/ssh_interactive.py:--启动堡垒机交互脚本
它需要有办法拿到main.py中argvhandler类中的参数(但它俩是完全不同的一种类,没法继承),
所以把argv_handler类实例传给它即可。
auth方法(认证程序):
interactive方法(启动交互脚本):一进来打印他可以访问的组,他一选择组就把组里列出来他能访问哪些机器,
from django.contrib.auth import authenticate #导入djnago的认证模块
from web import models
class SshHandler(object):
"""堡垒机交互脚本"""
#初始化,并把argv_handler类实例传给它
def __init__(self,argv_handler_instance):
self.argv_handler_instance = argv_handler_instance
# self.models = models def auth(self):
"""认证程序"""
count = 0
while count < 3:#输三次
username = input("堡垒机账号:").strip()
password = input("Password:").strip()
user = authenticate(username=username,password=password) #拿到数据库中认证信息
if user:#有这个用户则认证成功
self.user = user #把这个认证成功的用户存到实例中,因为后面要用
return True
else:#否则
count +=1 def interactive(self):
"""启动交互脚本"""
if self.auth():#先登录--返回的是true,则认证成功
print("Ready to print all the authorized hosts...to this user ...")
while True:#大循环让用户去选择主机组
host_group_list = self.user.host_groups.all()#拿到当前用户关联的所有主机组
#列出来:左边打印组右边打印所关联的主机
for index,host_group_obj in enumerate(host_group_list):
print("%s.\t%s[%s]"%(index,host_group_obj.name, host_group_obj.host_to_remote_users.count()))
print("z.\t未分组主机[%s]" % (self.user.host_to_remote_users.count())) choice = input("请选择主机组>>:").strip()
if choice.isdigit():#判断是数字
choice = int(choice)
#取出组中所有主机
selected_host_group = host_group_list[choice]
elif choice == 'z':#选择z则打印未分组的
selected_host_group = self.user while True:#选出组中主机并把未分组的他选的主机加到他选的组中
for index,host_to_user_obj in enumerate(selected_host_group.host_to_remote_users.all()):
print("%s.\t%s" % (index, host_to_user_obj)) choice = input("请选择主机>>:").strip()
if choice.isdigit():
choice = int(choice)
selected_host_to_user_obj = selected_host_group.host_to_remote_users.all()[choice]
print("going to logon %s" % selected_host_to_user_obj ) if choice == "b": #如果选择b则回到上一级
break
.如下图执行程序:若报错

会报如下错:说请求的settigs中的认证后端,但是settings中没有配置

因为之前是一直在django的环境中去调数据库,但现在相当脱离了django环境,自己写了个脚本调它,而django的数据库不是想调就能调---必须配置好相应环境才能允许你调,所以在脚本中要加三条命令:配置环境变量以及加载django所有的app
4.最终如下图:执行程序会出现如下图效果了

二.通过paramiko记录ssh会话记录
root@ubuntu:~# pip install paramiko -i https://pypi.douban.com/simple --安装 paramiko模块
1
2
第二部分用户交互程序开发,通过paramiko记录ssh会话记录的更多相关文章
- Python的用户交互程序及格式化输出
1. 用户输入 在Python 3 中,用户输入用input()函数即可实现用户交互程序. 例如,我们根据程序提示输入用户名和密码,并且打印输入的信息. 2. 字符串格式化输出 例如,我们根据程序提 ...
- Python学习笔记一:第一个Python程序,变量,字符编码与二进制,用户交互程序
第一个python程序 Windows:设置环境变量,X:\pthonxxx,xxx是版本号 在命令提示符下 输入python,进入解释器 >>>print(“Hello World ...
- Python 用户交互程序Input
1.用户交互,用户输入 用户输出命令是input. 设置一个变量并输出. name = input("name:") print(name) 注:python2 下 raw_inp ...
- Python 用户交互程序(day1)
一: 变量 变:变化,重在变字,量:计量,衡量,表示一种状态 变量赋值 : number = 1 变量的规则: 数字,字母,下划线, 任意组合,数字不能开头,python 的关键字不能用,变量名尽量有 ...
- python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for
也愿大家永葆初心-- 已识乾坤大,犹怜草木青. 一.python简介 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算 ...
- iOS-马上着手开发iOS应用应用程序-第二部分构建应用程序
第二部分构建应用程序 1,应用程序开发过程 2,设计用户界面 3,定义交互 4,教程:串联图 1,应用程序开发过程 定义概念 设计用户界面 定义交互 实现行为整合数据 对象是应用程序的基石 类是对象的 ...
- Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..
Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...
- 【好好编程-技术博客】微信小程序开发中前后端的交互
微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...
- 微信小程序开发 - 用户授权登陆
准备:微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 微信小程序开发文档:htt ...
随机推荐
- ASP.NET通过EntityFramework CodeFirst创建数据库
Number1 新建一个项目 给新项目添加一个实体数据模型 选择第三个 这里我创建两个有关系的类,也就是有外键关系的数据库表 using System; using System.Collection ...
- (Java实现) 洛谷 P1603 斯诺登的密码
题目背景 根据斯诺登事件出的一道水题 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置--但这不是最重要 ...
- Java实现 LeetCode 498 对角线遍历
498. 对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ ...
- Java实现 蓝桥杯VIP 算法训练 麦森数
算法训练 麦森数 时间限制:1.0s 内存限制:256.0MB 问题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底, ...
- Java实现复数运算
1 问题描述 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现. (3)必须使 ...
- Linux 用户管理命令-userdel和su
userdel [选项] 用户名,可以删除用户,常用选项 -r :删除用户的同时删除用户的家目录,一般都要用,例如:userdel -r xbb 新建用户和删除用户的本质也就是修改了 /etc/sha ...
- qt程序添加文件版本号
1.需要一个 *.rc 文件,用以保存相关信息.比如添加一个 app.rc 里面内容如下所示: IDI_ICON1 ICON DISCARDABLE "app.ico" ----- ...
- 软光栅-uraster代码阅读(入门极品)
软光栅-uraster代码阅读(入门极品) 代码链接:https://github.com/Steve132/uraster 所有的代码都在uraster.hpp中.代码非常简单,适合初学者学习软光栅 ...
- @loj - 2004@ 「SDOI2017」硬币游戏
目录 @description@ @solution@ @accepted code@ @details@ @description@ 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数 ...
- 从零开始的Spring Boot(1、搭建一个Spring Boot项目Hello World)
搭建一个Spring Boot项目Hello World 写在前面 从零开始的Spring Boot(2.在Spring Boot中整合Servlet.Filter.Listener的方式):http ...