需求及任务:实现一个给用户登录的界面(通过ssh登到堡垒机上,然后给它展现一个命令行的页面,然后他选择登哪台机器,一选择就连上去且把日志也记录下来)。

先在admin创建几条组数据并与用户关联如下图:

一.用户交互程序开发

  分析:等用户一连上我的堡垒机就启动我的程序,我这个程序是脚本的形式,脚本界面,跟用户交互,让它去连。

  真正交互的程序我把放在manage.py同级的bakend包下---我专放所有后端程序。

(1)和manage.py同级目录新建crazyeye_manager.py---这是程序的入口:

  导入backend中的main模块并实例化我在main.py中自定的ArgvHandler(object)"""接收用户参数,并调用相应的功能"""的类,并且直接传入参数后此实例就自己调用相应参数--我在main.py中自定的call方法。

  1. import sys,os
  2.  
  3. if __name__ == "__main__":
  4. #让脚本能访问django数据库环境需要如下三条命令:
  5. ##设置环境变量
  6. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "s3CrazyEye.settings")
  7. #把django相关联的app都加载一遍
  8. import django
  9. django.setup()
  10.  
  11. from backend import main #导入
  12. interactive_obj = main.ArgvHandler(sys.argv)#交互程序可能需要很多参数
  13. interactive_obj.call() #调用call方法

(2)backend/main.py:

  argvhandler类(接收用户参数,并调用相应的功能)--只负责处理/调用参数即它只是一个入口

    help_msg方法(打印帮助):列出可用功能如提示run方法就是启动用户交互程序

    call方法(根据用户参数,调用对应的方法)

    run方法(启动用户交互程序)

  1. class ArgvHandler(object):
  2. """接收用户参数,并调用相应的功能"""
  3. def __init__(self,sys_args):#初始化类
  4. self.sys_args = sys_args #给类传sys_args参数
  5. def help_msg(self,error_msg=''):
  6. """打印帮助"""
  7. msgs = """
  8. %s
  9. run 此方法启动用户交互程序
  10. """ % error_msg
  11.  
  12. exit(msgs)
  13. def call(self):
  14. """根据用户参数,调用对应的方法"""
  15. if len(self.sys_args) == 1: #如果等于1则代表什么也没输
  16. self.help_msg()
  17. #让call法后面跟的第一个参数就是run函数名
  18. if hasattr(self,self.sys_args[1]):#如果类参数中有run方法则拿到此方法并调用执行它(1就是方法,因为0是此脚本本身)
  19. func = getattr(self,self.sys_args[1])
  20. func()
  21. else:
  22. self.help_msg("没有方法:%s"% self.sys_args[1])
  23.  
  24. def run(self):
  25. """启动用户交互程序"""
  26. from backend.ssh_interactive import SshHandler
  27. obj = SshHandler(self) #把自己传给这个类方法
  28. obj.interactive() #启动交互脚本

(3)backend/ssh_interactive.py:--启动堡垒机交互脚本

  它需要有办法拿到main.py中argvhandler类中的参数(但它俩是完全不同的一种类,没法继承),

所以把argv_handler类实例传给它即可。

  auth方法(认证程序):

  interactive方法(启动交互脚本):一进来打印他可以访问的组,他一选择组就把组里列出来他能访问哪些机器,

  1. from django.contrib.auth import authenticate #导入djnago的认证模块
  2. from web import models
  3. class SshHandler(object):
  4. """堡垒机交互脚本"""
  5. #初始化,并把argv_handler类实例传给它
  6. def __init__(self,argv_handler_instance):
  7. self.argv_handler_instance = argv_handler_instance
  8. # self.models = models
  9.  
  10. def auth(self):
  11. """认证程序"""
  12. count = 0
  13. while count < 3:#输三次
  14. username = input("堡垒机账号:").strip()
  15. password = input("Password:").strip()
  16. user = authenticate(username=username,password=password) #拿到数据库中认证信息
  17. if user:#有这个用户则认证成功
  18. self.user = user #把这个认证成功的用户存到实例中,因为后面要用
  19. return True
  20. else:#否则
  21. count +=1
  22.  
  23. def interactive(self):
  24. """启动交互脚本"""
  25. if self.auth():#先登录--返回的是true,则认证成功
  26. print("Ready to print all the authorized hosts...to this user ...")
  27. while True:#大循环让用户去选择主机组
  28. host_group_list = self.user.host_groups.all()#拿到当前用户关联的所有主机组
  29. #列出来:左边打印组右边打印所关联的主机
  30. for index,host_group_obj in enumerate(host_group_list):
  31. print("%s.\t%s[%s]"%(index,host_group_obj.name, host_group_obj.host_to_remote_users.count()))
  32. print("z.\t未分组主机[%s]" % (self.user.host_to_remote_users.count()))
  33.  
  34. choice = input("请选择主机组>>:").strip()
  35. if choice.isdigit():#判断是数字
  36. choice = int(choice)
  37. #取出组中所有主机
  38. selected_host_group = host_group_list[choice]
  39. elif choice == 'z':#选择z则打印未分组的
  40. selected_host_group = self.user
  41.  
  42. while True:#选出组中主机并把未分组的他选的主机加到他选的组中
  43. for index,host_to_user_obj in enumerate(selected_host_group.host_to_remote_users.all()):
  44. print("%s.\t%s" % (index, host_to_user_obj))
  45.  
  46. choice = input("请选择主机>>:").strip()
  47. if choice.isdigit():
  48. choice = int(choice)
  49. selected_host_to_user_obj = selected_host_group.host_to_remote_users.all()[choice]
  50. print("going to logon %s" % selected_host_to_user_obj )
  51.  
  52. if choice == "b": #如果选择b则回到上一级
  53. 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会话记录的更多相关文章

  1. Python的用户交互程序及格式化输出

    1.  用户输入 在Python 3 中,用户输入用input()函数即可实现用户交互程序. 例如,我们根据程序提示输入用户名和密码,并且打印输入的信息. 2. 字符串格式化输出 例如,我们根据程序提 ...

  2. Python学习笔记一:第一个Python程序,变量,字符编码与二进制,用户交互程序

    第一个python程序 Windows:设置环境变量,X:\pthonxxx,xxx是版本号 在命令提示符下 输入python,进入解释器 >>>print(“Hello World ...

  3. Python 用户交互程序Input

    1.用户交互,用户输入 用户输出命令是input. 设置一个变量并输出. name = input("name:") print(name) 注:python2 下 raw_inp ...

  4. Python 用户交互程序(day1)

    一: 变量 变:变化,重在变字,量:计量,衡量,表示一种状态 变量赋值 : number = 1 变量的规则: 数字,字母,下划线, 任意组合,数字不能开头,python 的关键字不能用,变量名尽量有 ...

  5. python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for

    也愿大家永葆初心-- 已识乾坤大,犹怜草木青. 一.python简介 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算 ...

  6. iOS-马上着手开发iOS应用应用程序-第二部分构建应用程序

    第二部分构建应用程序 1,应用程序开发过程 2,设计用户界面 3,定义交互 4,教程:串联图 1,应用程序开发过程 定义概念 设计用户界面 定义交互 实现行为整合数据 对象是应用程序的基石 类是对象的 ...

  7. Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..

    Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...

  8. 【好好编程-技术博客】微信小程序开发中前后端的交互

    微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...

  9. 微信小程序开发 - 用户授权登陆

    准备:微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 微信小程序开发文档:htt ...

随机推荐

  1. Java实现 洛谷 P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元 ...

  2. Java实现 洛谷 P1738 洛谷的文件夹

    题目描述 kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现. 洛谷的网页端,有很多文件夹,文件夹还套着文件夹. 例如:/luogu/application/c ...

  3. Java实现 LeetCode 5 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  4. java实现第二届蓝桥杯异或加密法

    异或加密法. 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算. 解密的方法就是再执行一次同样的操作. 加密过程中n位二进制数会循环使用.并且其长度也可能不是8的整数倍. ...

  5. java实现第五届蓝桥杯殖民地

    殖民地 带着殖民扩张的野心,Pear和他的星际舰队登上X星球的某平原.为了评估这块土地的潜在价值,Pear把它划分成了M*N格,每个格子上用一个整数(可正可负)表示它的价值. Pear要做的事很简单- ...

  6. python—异常处理

    一:什么是异常? (异常就是程序运行时发生错误的信号) 错误分两种: 1.语法错误 2.逻辑错误 二:异常的种类? (在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类 ...

  7. 深入浅出-iOS Block原理和内存中位置

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 #简介 今天回顾一下blcok,基本 ...

  8. harbor私有仓库安装

    准备环境 centos7.4 docker-ce 19.03.8 docker-compose version 1.18.0 harbor 版本: 1.7.5   一.安装dokcer # 安装依赖包 ...

  9. Android开发项目中常用到的开源库

    圆形头像 https://github.com/hdodenhof/CircleImageView ButterKnife https://github.com/JakeWharton/butterk ...

  10. 2020/06/06 JavaScript高级程序设计 面向对象的程序设计

    ECMAScript虽然是一种面向对象的语言,但是他没有类的概念.所以他的对象也与其他语言中的对象有所不同. ECMA-262定义对象:一组没有特定顺序的值. 6.1 理解对象 创建对象的方法: 1. ...