#main.py
#本文件写所有的连接交互动作程序
# ————————————————03堡垒机在Linux系统里记录会话日志 开始————————————————
from Fortress import models #数据库
import subprocess#系统交互#subprocess模块允许我们创建子进程,连接他们的输入/输出/错误管道,还有获得返回值。
import uuid #通用唯一识别码
import os #系统
BASE_DIR = os.path.dirname(os.path.abspath(__file__))# 动态路径,当前文件的父目录
#E:\堡垒机\eye\Fortress\backend
# ————————————————03堡垒机在Linux系统里记录会话日志 结束————————————————
#————————————————02堡垒机设计后台交互程序 开始————————————————
from django.contrib.auth import authenticate #验证用户的证书
import getpass#输入密码时不显示密码
#用户登陆堡垒机后的交互程序
class HostManager(object):
def __init__(self):
self.user = None #当前账号
# ————————————————03堡垒机在Linux系统里记录会话日志 开始————————————————
def get_session_id(self,bind_host_obj,uuid):#创建应用会话的id
print('创建新的会话:',self.user.id,bind_host_obj,uuid)
session_obj = models.Session(user_id = self.user.id,bind_host=bind_host_obj,uuid=uuid)#创建数据库
session_obj.save()#会话保存
print('新的会话的ID:',session_obj.id)
return session_obj#返回会话
# ————————————————03堡垒机在Linux系统里记录会话日志 结束————————————————
def interactive(self):#交互脚本
# ————————————————登录堡垒机 开始————————————————
print("----开始 运行交互脚本----")
count = 0 #用户名密码试错的次数
while count < 6:#用户名密码试错的次数
username = input("请输入你的用户名:").strip()#用户名
password = getpass.getpass("请输入你的密码:").strip()#密码
user = authenticate(username=username,password=password)#验证用户名密码
if user: #验证成功
print("欢迎 %s 登陆使用!".center(50,'-') % user.name )
self.user = user #验证成功,赋值
break #退出无限循环
else:
print("用户名或密码错误!")
count += 1#用户名密码试错的次数
else:
print("----结束 运行交互脚本----")
exit("用户名密码试错的次数到了,再见。")
"""
#————从外部调用django的方法 开始————
#注意写,从外部调用django的方法 E:\堡垒机\eye\fortess_manage.py
#注意,到admin后台配置主机给账户
# ————————————
#运行 Terminal
#E:\堡垒机\eye>python fortess_manage.py
#Username:admin@qq.com
#Password:admin123456
#————从外部调用django的方法 结束————
"""
# ————————————————登录堡垒机 结束————————————————
# ——————————————选择要连接的主机 开始————————————
if self.user: #验证登录成功
while True:
#————————打印当前账户所有的可以登录主机 开始——————
for index,host_group in enumerate(self.user.host_groups.all()): #select_related()
print("%s.\t%s[%s]" %(index,host_group.name, host_group.bind_hosts.count()))
print("z.\t未分组主机[%s]" %(self.user.bind_hosts.count()))
#————————打印当前账户所有的可以登录主机 结束——————
# ————————开始选择分组 开始——————
choice = input("%s>>:"% self.user).strip()#输入选择
if len(choice) == 0:#长度等于0
continue#跳过这次循环
selected_host_group = None #选择分组
if choice.isdigit():#检测字符串是否只由数字组成
choice = int(choice)#转成整数
if choice >=0 and choice <= index: #判断输入的选项是否合法
selected_host_group = self.user.host_groups.all()[choice]#迭代选择分组
elif choice == 'z':#未分组
selected_host_group = self.user
# ————————开始选择分组 结束——————
# ————————开始选择主机 开始——————
if selected_host_group: #选择分组后选择主机
while True:
print("当前选择的分组: %s ".center(50,'-') %selected_host_group)
# ————————打印分组里的所有主机 开始——————
for index, bind_host in enumerate(selected_host_group.bind_hosts.all()):
print("%s.\t%s" % (index, bind_host))
print("返回上级菜单,请按 b ")
# ————————打印分组里的所有主机 结束——————
# ————————选择分组里的主机 开始——————
choice = input("%s>>>:" % self.user).strip()#输入选择
if choice.isdigit():#检测字符串是否只由数字组成
choice = int(choice)#转成整数
if choice >= 0 and choice <= index:#判断输入的选项是否合法
bind_host = selected_host_group.bind_hosts.all()[choice]#迭代选择主机
print("准备登录 %s 主机".center(50,'-') %bind_host)
# ————————选择分组里的主机 结束——————
# ————————————————03堡垒机在Linux系统里记录会话日志 开始————————————————
if bind_host.host.enabled:#是否启用了此主机
ssh_uuid = uuid.uuid4() # 唯一标识
session_obj = self.get_session_id(bind_host, ssh_uuid) # 创建应用会话的id
print("创建会话审计记录,用ID关联shell脚本创建的文件名:", session_obj)
# ————————在Linux系统下打开新进程的shell监控脚本 开始————————
monitor_script = subprocess.Popen("sh %s/session_tracker.sh %s %s"
% (BASE_DIR, # 动态路径,当前文件的父目录
ssh_uuid, # 唯一标识
session_obj.id),#新的会话的ID
shell=True,#如果把shell设置成True,指定的命令会在shell里解释执行。
stdout=subprocess.PIPE, # subprocess 实现管道( pipe )交互操作读/写通信
stderr=subprocess.PIPE) # stdout, stdin, stderr的中文名字分别是标准输出,标准输入和标准错误。
print('监控执行的脚本:', monitor_script)
# print('读取标准错误,很慢,测试时才用:',monitor_script.stderr.read())
# ————————在Linux系统下打开新进程的shell监控脚本 结束————————
# ————————只能在Linux系统下运行 开始————————
print('准备连接远程主机......')
cmd_str = "sshpass -p %s ssh -p %s %s@%s -E %s -o StrictHostKeyChecking=no" % (
bind_host.remote_user.password, # 登录的密码
bind_host.host.port, # 登录的IP端口
bind_host.remote_user.username, # 登录的账号
bind_host.host.ip_addr, # 登录的IP地址
ssh_uuid) # 唯一标识
# sshpass 可以在命令行直接使用密码来进行远程连接和远程拉取文件。只能在Linux系统下运行。
# -E 临时文件名 -o StrictHostKeyChecking=no 忽略登陆确认提示
print('要执行的命令:', cmd_str)#实际生产时关闭
# 要执行的命令: sshpass -p 123456 ssh -p 22 root@192.192.168.127 -E a1255ca0-2ed8-4a56-866b-758e96d871d5 -o StrictHostKeyChecking=no
subprocess.run(cmd_str, shell=True) # 只能在Linux系统下运行
# ————————只能在Linux系统下运行 结束————————
else:
print('此主机未启用,请联系管理员!!')
# ————————————————03堡垒机在Linux系统里记录会话日志 结束————————————————
elif choice == 'b':#退出
break #终止无限循环
# ————————开始选择主机 结束——————
# ——————————————选择要连接的主机 结束————————————
#————————————————02堡垒机设计后台交互程序 结束———————————————— """
————————安装django 开始————————
login as: root
root@192.192.168.126's password: 123456
[root@localhost ~]# python3
>>> import django
>>> exit()
[root@localhost ~]# pip3 install --upgrade pip
[root@localhost ~]# pip3 install --default-timeout=1000 Django==2.1.4
[root@localhost ~]# python3
>>> import django
>>> print(django.get_version())
2.1.4
>>> exit()
————————安装django 结束————————
"""#安装django
"""
————————安装strace跟踪线程 开始————————
[root@localhost ~]# yum -y install strace
[root@localhost ~]# ssh root@192.192.168.110 |
root@192.192.168.110's password:123456 |
| [root@localhost ~]# ps -ef
| UID PID PPID C STIME TTY TIME CMD
| root 5999 5936 0 08:06 pts/2 00:00:00 ssh root@192.192.168.110
| [root@localhost ~]# sudo strace -p 5999
[root@localhost ~]# l | read(4, "l", 16384) = 1
| [root@localhost ~]# sudo strace -p 5999 -o eye.log
[root@localhost ~]# A |
| [root@localhost ~]# cat eye.log
| [root@localhost ~]# cat eye.log |grep 'read(4'
| read(4, "A", 16384) = 1
————————安装strace跟踪线程 结束————————
"""#安装strace跟踪线程
"""
————————sshpass可以在命令行直接使用密码来进行远程连接和远程拉取文件 开始————————
[root@localhost ~]# yum -y install sshpass
[root@localhost ~]# sshpass -p 123456 ssh -p 22 root@192.192.168.110
[root@localhost ~]# ip addr
————————用python调用sshpass 开始————————
[root@localhost ~]# python3
>>> import subprocess
>>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -o StrictHostKeyChecking=no",shell=True)
————————另启一个会话查看————————
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 5147 5146 0 09:41 pts/8 00:00:00 ssh root@192.192.168.110 -o StrictHostKeyCh
[root@localhost ~]# sudo strace -fp 5147 -t -o eye.log
[root@localhost ~]# cat eye.log
————获取进程号 开始————
[root@localhost ~]# ps -ef | grep 'root@192.192.168.110'
[root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh
[root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass
[root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass | awk '{ print $2 }'
————获取进程号 结束————
————————用python调用sshpass 结束————————
————————sshpass可以在命令行直接使用密码来进行远程连接和远程拉取文件 结束————————
"""#sshpass
"""
————————获取进程号,唯一标识 开始————————
[root@localhost ~]# python3
>>> import subprocess
>>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs123 -o StrictHostKeyChecking=no",shell=True)
————————另启一个登陆会话————————
[root@localhost ~]# python3
>>> import subprocess
>>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs456 -o StrictHostKeyChecking=no",shell=True)
————————另启一个会话查看————————
[root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass | grep wybs123 | awk '{ print $2 }'
[root@localhost ~]# ps -ef | grep wybs123 | grep ssh | grep -v sshpass | awk '{ print $2 }'
————————获取进程号,唯一标识 结束————————
"""#获取进程号
"""
E:\堡垒机\eye\Fortress\backend\session_tracker.sh 复制到 CentOS-7 的 /home/ 目录下
————————SH脚本测试 开始————————
[root@localhost ~]# sh /home/session_tracker.sh
[root@localhost ~]# sh /home/session_tracker.sh wybs123 99
————————SH脚本测试 结束————————
————————用python3测试SH脚本 开始————————
[root@localhost ~]# python3
>>> import subprocess
>>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs123 -o StrictHostKeyChecking=no",shell=True)
————————另启一个会话查看————————
[root@localhost ~]# ps -ef | grep wybs123 | grep ssh | grep -v sshpass | awk '{ print $2 }'
[root@localhost ~]# sh /home/session_tracker.sh wybs123 99
————————用python3测试SH脚本 结束————————
"""#SH脚本测试
"""
————————创建跳板机的独立用户 开始————————
[root@localhost ~]# useradd jump |#新建用户(跳)
[root@localhost ~]# passwd jump |#修改用户(跳)的密码
新的 密码:admineye
重新输入新的 密码:admineye
————————创建跳板机的独立用户 结束————————
————————测试独立用户Django使用权限 开始————————
[root@localhost ~] su jump
[jump@localhost root]$ python3
>>> import django
>>> print(django.get_version())
2.1.4
>>> exit()
[jump@localhost root]$ su root
密码:123456
————————测试独立用户Django使用权限 结束————————
——虚拟机不用——————Luxin系统给独立用户Django使用权限 开始——site-packages——————
[root@localhost ~]# python3
>>> import sys
>>> sys.path
>>> exit()
[root@localhost ~]# sudo cp -rp /usr/lib64/anacnda3/lib/python3.6/site-packages/* /home/jump/.local/lib/python3.6/site-packages/
[root@localhost ~]# cd /home/jump/.local/lib/python3.6/site-packages/
[root@localhost ~]# sudo chown -R jump.jump *
[root@localhost ~]# ll
——虚拟机不用——————Luxin系统给独立用户Django使用权限 结束——site-packages——————
"""#独立用户
"""
E:\堡垒机\eye 将项目复制到 CentOS-7 的 /home/jump/ 目录下
———————复制Python代码到服务用户目录下 开始—————————
注意:修改settings中的设置,使其允许所有网段访问: ALLOWED_HOSTS = ['*']
[root@localhost ~]# cd /home/jump/eye
[root@localhost eye]# ls
[root@localhost eye]# python3 manage.py runserver 0.0.0.0:9000 |#运行服务时使用0.0.0.0:9000作为IP和端口,执行命令
[root@localhost ~]# systemctl stop firewalld.service |#注意:关闭防火墙
———————复制Python代码到服务用户目录下 结束————————— ———————测试项目交互脚本 开始—————————
[root@localhost ~]# python3 /home/jump/eye/fortess_manage.py
[root@localhost ~]# chmod -R 777 /home/jump |#修改权限,复制python项目文件到Luxin系统后注意重新赋值权限
———————测试项目交互脚本 结束—————————
"""#启动服务
"""
———————Windows系统测试 开始—————————
浏览器访问:http://192.192.168.143:9000/admin/
————putty测试 开始————
login as: jump
jump@192.192.168.143's password:admineye
----开始 运行交互脚本。。。----
Username:admin@qq.com
Password:admin123456
----------------------欢迎 admin-----------------------
0. 测试组[1]
z. 未分组主机[1]
admin>>:
————putty测试 结束————
———————Windows系统测试 结束—————————
"""#Windows系统测试
"""
——————————session_tracker.sh给独立用户jump权限,创建日志免密码 开始——————————
[root@localhost ~]# vim /etc/sudoers
———————进入vim文本编辑操作 开始—————————
| i |#进入插入文本模式
_______到底部插入 开始_______
%jump ALL=NOPASSWD:ALL #/use/bin/strace,/usr/bin/python3
_______到底部插入 结束_______
| Esc |#退出插入文本模式
| Shift + Q |#进行EX操作模式
| wq! |#保存#退出vim文本编辑操作
———————进入vim文本编辑操作 结束—————————
——————————session_tracker.sh给独立用户jump权限,创建日志免密码 结束——————————
"""#创建日志
"""
————————配置独立用户启动项 开始————————
[root@localhost ~]# cd /home/jump
[root@localhost jump]# ls -a
. .. .bash_logout .bash_profile .bashrc
[root@localhost eye]# vim .bashrc
————如果vim打开错误 开始————
[root@localhost conf]# rpm -qa|grep vim |#如果vim打开错误
[root@localhost conf]# yum -y install vim* |#安装vim
————如果vim打开错误 结束————
————进入vim文本编辑操作 开始————
| i |#进入插入文本模式
_____原有的内容 开始_____
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
_____原有的内容 结束_____
_____插入的内容 开始_____
python3 /home/jump/eye/fortess_manage.py
logout
_____插入的内容 结束_____
| Esc |#退出插入文本模式
| Shift + Q |#进行EX操作模式
| w |#保存vim文本编辑操作
| q |#退出vim
————进入vim文本编辑操作 结束————
————————配置独立用户启动项 结束————————
"""#启动项
"""
———————复制Python代码,后快速启动服务 开始—————————
[root@localhost ~]# chmod -R 777 /home/jump |#修改权限,复制python项目文件到Luxin系统后注意重新赋值权限
[root@localhost ~]# python3 /home/jump/eye/manage.py runserver 0.0.0.0:9000
———————复制Python代码,后快速启动服务 结束—————————
"""#快速启动服务

#main.py

 #models.py
#————————————————01堡垒机重写DJANGO账户表 开始————————————————
from django.db import models #模型
from django.contrib.auth.models import BaseUserManager,AbstractBaseUser,PermissionsMixin#DJANGO账户继承重写
#重写DJAGO账号表
class UserProfileManager(BaseUserManager):
def create_user(self, email, name, password=None):#创建并保存一个普通用户给定的邮箱地址,密码。
if not email:
raise ValueError('用户必须有一个电子邮箱地址')
user = self.model(email=self.normalize_email(email),#验证邮箱格式
name=name,)#创建一条普通用户记录
user.set_password(password)#对密码加密
user.save(using=self._db)#从临时文件读取出来数据,进行保存。
return user
def create_superuser(self, email,name,password):#创建并保存一个超级用户给定的邮箱地址,密码。
user = self.create_user(email,name=name,password=password)#创建一条超级用户记录
user.is_admin = True#管理员
user.save(using=self._db)#从临时文件读取出来数据,进行保存。
return user
#重写DJAGO账号表
class UserProfile(AbstractBaseUser,PermissionsMixin):
# ————#DJANGO账号必须要有的字段 开始————
email = models.EmailField( max_length=255,unique=True,verbose_name='邮箱地址')
name = models.CharField(max_length=32,verbose_name='昵称')
is_active = models.BooleanField(default=True,verbose_name='是否启用')
is_admin = models.BooleanField(default=False,verbose_name='管理员',help_text='指定用户是否可以登录管理网站并且拥有全部权限',)
is_staff = models.BooleanField(default=True,verbose_name='员工状态',help_text='指定用户是否可以登录管理网站',)
# ————#DJANGO账号必须要有的字段 结束———— # ————————————————02堡垒机设计后台交互程序 开始————————————————
bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="关联的主机")
host_groups = models.ManyToManyField('HostGroups',blank=True,verbose_name="关联的分组")
# ————————————————02堡垒机设计后台交互程序 结束———————————————— #————#创建用户记录 开始————
objects = UserProfileManager()#创建用户记录,固定的变量名(objects)
USERNAME_FIELD = 'email' #用于登录的字段
REQUIRED_FIELDS = ['name']#必须填写
# ————#创建用户记录 结束————
# ————#DJANGO账号必须要有的方法 开始————
def get_full_name(self):#用户确认的电子邮件地址
return self.email
def get_short_name(self):#用户确认的电子邮件地址
return self.email
# ————#DJANGO账号必须要有的方法 结束————
def __str__(self):# __unicode__ on Python 2
return self.email
# ————#DJANGO账号权限 开始————
def has_perm(self, perm, obj=None):#权限#用户有一个特定的许可吗?
return True
def has_module_perms(self, app_label):#用户有权限查看应用名称吗?
return True
# ————#DJANGO账号权限 结束————
class Meta:
verbose_name_plural='00账户'
# ————自定制admin 开始————
#到admin.py里给DJANGO账户注册显示 #E:\堡垒机\eye\Fortress\admin.py
# ————自定制admin 结束————
# ————注册到配置文件 开始————
#到配置文件里给DJANGO账户指定模型 #E:\堡垒机\eye\eye\settings.py
#AUTH_USER_MODEL = 'web.UserProfile'
# ————注册到配置文件 结束————
#————————————————01堡垒机重写DJANGO账户表 结束————————————————
#————————————————02堡垒机设计后台交互程序 开始————————————————
#01标签
class Tag(models.Model):
name = models.CharField(max_length=64,unique=True) #标签名#CharField定长文本#最长度=64字节#不可以重复
class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
verbose_name_plural = "01标签" #verbose_name_plural给你的模型类起一个更可读的名字
def __str__(self): # __str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
return self.name # 返回 #标签名
#02机房
class IDC(models.Model):
name = models.CharField(max_length=64, unique=True,verbose_name="机房名")
address=models.CharField(max_length=256,blank=True,null=True,verbose_name="机房地址")
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="机房的备注")
tag = models.ManyToManyField("Tag",blank=True,verbose_name="标签")#多对多关联到 标签表
date = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
verbose_name_plural='02机房'
def __str__(self):
return self.name
#03主机
class Host(models.Model):
hostname = models.CharField(max_length=64,unique=True,verbose_name="主机名")
ip_addr = models.GenericIPAddressField(verbose_name="主机IP地址")
port = models.SmallIntegerField(default=22,verbose_name="主机端口")
idc = models.ForeignKey('IDC',blank=True,null=True,on_delete=models.CASCADE,verbose_name="主机所在的机房")
system_type_choices = ((0,'Linux'),(1,'Windows'))
system_type = models.SmallIntegerField(choices=system_type_choices,default=0,verbose_name="操作系统类型")
enabled = models.BooleanField(default=1,verbose_name="是否启用本机")
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主机的备注")
tag = models.ManyToManyField("Tag",blank=True,verbose_name="标签")#多对多关联到 标签表
date = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
verbose_name_plural='03主机'
unique_together = ('ip_addr','port')
def __str__(self):
return "%s(%s)" % (self.hostname, self.ip_addr)
#04账号密码
class RemoteUser(models.Model):
auth_type_choices =((0,'ssh-password'), (1,'ssh-key'))
auth_type = models.SmallIntegerField(choices=auth_type_choices,default=0,verbose_name="连接方式,密码或者密钥")
userlevel=models.CharField(max_length=128,blank=True,null=True,verbose_name="用户等级")
username = models.CharField(max_length=128,verbose_name="用户名")
password = models.CharField(max_length=256,verbose_name="密码或者密钥",help_text="如果连接方式选择为ssh-key,那此处就应该是key的路径")
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="账号密码的备注")
host_prompt=models.ManyToManyField("Host",blank=True,verbose_name="可关联的主机",help_text="关联主机与账号密码提示")
tag = models.ManyToManyField("Tag",blank=True,verbose_name="标签")#多对多关联到 标签表
date = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
verbose_name_plural='04账号密码'
unique_together = ('auth_type', 'username', 'password') # 联合唯一
def __str__(self):
return "%s:%s:%s" %(self.id,self.username,self.memo)
#05关联主机与账号密码
class BindHost(models.Model):
host = models.ForeignKey('Host',on_delete=models.CASCADE,verbose_name="远程主机名")
remote_user = models.ForeignKey('RemoteUser',on_delete=models.CASCADE,verbose_name="远程用户名")
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="关联的备注")
tag = models.ManyToManyField("Tag",blank=True,verbose_name="标签")#多对多关联到 标签表
date = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
verbose_name_plural = '05关联主机与账号密码'
unique_together = ('host', 'remote_user')#联合唯一
def __str__(self):
return "<%s:%s:%s>" %(self.host.id,self.host.hostname,self.remote_user.username)
#06主机分组
class HostGroups(models.Model):
name = models.CharField(max_length=64,unique=True,verbose_name="分组名称")
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主机分组的备注")
bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="远程主机")
tag = models.ManyToManyField("Tag",blank=True,verbose_name="标签")#多对多关联到 标签表
date = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
verbose_name_plural='06主机分组'
def __str__(self):
return self.name
#————————————————02堡垒机设计后台交互程序 结束————————————————
#————————————————03堡垒机在Linux系统里记录会话日志 开始————————————————
#07会话日志
class Session(models.Model):
user = models.ForeignKey('UserProfile',on_delete=models.CASCADE,verbose_name='堡垒机账号')
bind_host = models.ForeignKey('BindHost',on_delete=models.CASCADE,verbose_name='远程主机')
uuid = models.CharField(max_length=128,default='n/a',verbose_name='唯一标识,进程ID')
cmd_count = models.IntegerField(default=0,verbose_name='命令执行数量')
stay_time = models.IntegerField(default=0,verbose_name="停留时长(秒)" ,help_text="每次刷新自动计算停留时间")
closed = models.BooleanField(default=False,verbose_name='是否关闭这条会话记录')
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="会话日志的备注")
tag = models.ManyToManyField("Tag",blank=True,verbose_name="标签")#多对多关联到 标签表
date = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
def __str__(self):
return '<id:%s user:%s bind_host:%s>' % (self.id,self.user.email,self.bind_host.host)
class Meta:
verbose_name_plural = '07会话日志'
#————————————————03堡垒机在Linux系统里记录会话日志 结束———————————————— """
# ————————————————Django中使用中国时区和中文 开始————————————————
到settings.py里修改#E:\堡垒机\eye\eye\settings.py
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
如果需要全局配置默认时区和语言,可在django下的conf模块下的global_settings.py中进行配置
所有可选的语言选项可通过python输入以下代码查看:
from django.conf.locale import LANG_INFO
{key: LANG_INFO[key]['name_local'] for key in LANG_INFO if 'name_local' in LANG_INFO[key]}
# ————————时间扩展 开始————————
USE_TZ = True
当设置了 USE_TZ 为 True 时,Django 与其他系统或服务的交流将强制使用 UTC 时间。
1.保证存储到数据库中的是 UTC 时间;
2.在函数之间传递时间参数时,确保时间已经转换成 UTC 时间;
# ——Django中跨时区 开始——
一般不跨时区的应用,可以不使用时区,即在settings.py设置
USE_TZ = False
这样存储的时间就是无时区的时间。
# ——Django中跨时区 结束——
# ————————时间扩展 结束————————
# ————————————————Django中使用中国时区和中文 结束————————————————
"""#Django中使用中国时区和中文
"""
# ————————————————Django数据库生成 开始————————————————
运行 Terminal
生成 数据表
E:\堡垒机\eye>python manage.py makemigrations
数据表 迁移
E:\堡垒机\eye>python manage.py migrate
# ————————————————Django数据库生成 结束————————————————
"""#Django数据库生成
"""
# ————————————————重写Django账号表后的创建方法 开始————————————————
E:\堡垒机\eye>python manage.py createsuperuser
邮箱地址: admin@qq.com
昵称: admin
Password: admin123456
Password (again): admin123456
Superuser created successfully.
# ————————————————重写Django账号表后的创建方法 结束————————————————
#启动 DJANGO 服务
E:\堡垒机\eye>python manage.py runserver 127.0.0.1:8000
"""#重写Django账号表后的创建方法

#models.py

 #admin.py
#————————————————01堡垒机重写DJANGO账户表 开始————————————————
#————————同目录下可以用 . 开始————————
#from Fortress import models#数据库 #重写DJAGO账号表
from . import models#数据库 #重写DJAGO账号表
#————————同目录下可以用 . 结束————————
from django import forms #django的字段验证
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin ##表单添加和更改用户实例
from django.contrib.auth.forms import ReadOnlyPasswordHashField#只读密码散列字段
from django.contrib import admin #注册类到admin
#创建新用户
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='设置密码', widget=forms.PasswordInput)#密码
password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput)#确认密码
class Meta:
model = models.UserProfile
fields = ['email', 'name']
def clean_password2(self): #检查两个密码条目是否一样(匹配)
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("密码不匹配")
return password2
def save(self, commit=True): #保存密码(散列的格式提供)
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()#保存
return user
# 修改用户密码
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField(label="修改密码",
help_text=("原始密码不存储,所以没有办法看到"
"这个用户的密码,但是你可以改变密码 "
"使用 <a href=\"../password/\">修改密码</a>."))#哈值#只读密码散列字段
class Meta:
model = models.UserProfile
fields = ['email', 'password', 'name', 'is_active', 'is_admin']
def clean_password(self):#不管用户提供什么,返回初始值。
return self.initial["password"] #表单添加和更改用户实例
class UserProfileAdmin(BaseUserAdmin):
form = UserChangeForm #修改
add_form = UserCreationForm#创建
# 字段用于显示用户模型。
# 这些覆盖定义UserAdmin固定在底座上
# auth.User参考特定字段。
list_display = ['email', 'name','is_staff', 'is_admin']#后台显示的字段
list_filter = ['is_admin','is_staff']#后台过滤的字段
fieldsets = (('账号密码', {'fields': ('email', 'password')}),
('个人信息', {'fields': ('name',)}),
# ————————————————02堡垒机设计后台交互程序 开始————————————————
('堡垒机主机授权', {'fields': ('bind_hosts', 'host_groups')}),
# ————————————————02堡垒机设计后台交互程序 结束————————————————
('权限', {'fields': ('is_admin','is_staff','user_permissions','groups')}),)
#添加账户时显示要填写的字段
add_fieldsets = (('添加账户', {'classes': ('wide',),#wide(宽屏样式)
'fields': ('email', 'name', 'password1', 'password2')}),)
search_fields = ['email']#后台搜索的字段
ordering = ['email']#后台排序的字段
filter_horizontal =['user_permissions','groups',#必须覆盖的变量#后台复选框的字段
# ————————————————02堡垒机设计后台交互程序 开始————————————————
'bind_hosts', 'host_groups',
# ————————————————02堡垒机设计后台交互程序 结束————————————————
]
admin.site.register(models.UserProfile, UserProfileAdmin)#现在注册这个新UserProfileAdmin
# ——可选——使用Django的内置权限 开始————
#from django.contrib.auth.models import Group #权限组
#admin.site.unregister(Group)#权限组#因为我们不使用Django的内置权限,
# ——可选——使用Django的内置权限 结束————
#————————————————01堡垒机重写DJANGO账户表 结束———————————————— #————————————————02堡垒机设计后台交互程序 开始————————————————
#01标签
class TagAdmin(admin.ModelAdmin):
list_display = ['id','name'] #显示字段表头
list_editable = ['name'] #可编辑
search_fields = ['name'] #搜索
admin.site.register(models.Tag, TagAdmin)
#02机房
class IDCAdmin(admin.ModelAdmin):
list_display = ['id','name','address','memo','date'] #显示字段表头
list_editable = ['name','address', 'memo'] #可编辑
search_fields = ['name','tag'] #搜索
filter_horizontal = ['tag'] #复选框
admin.site.register(models.IDC, IDCAdmin)
#03主机
class HostAdmin(admin.ModelAdmin):
list_display = ['id','hostname','ip_addr','port','memo','enabled','date'] #显示字段表头
list_editable = ['hostname','ip_addr','port','memo','enabled'] #可编辑
search_fields = ['hostname','ip_addr','port','tag'] #搜索
filter_horizontal = ['tag'] #复选框
admin.site.register(models.Host, HostAdmin)
#04账号密码
class RemoteUserAdmin(admin.ModelAdmin):
list_display = ['id','userlevel','username','memo','date'] #显示字段表头
list_editable = ['memo'] #可编辑
search_fields = ['userlevel','username','tag'] #搜索
filter_horizontal = ['host_prompt','tag'] #复选框
admin.site.register(models.RemoteUser,RemoteUserAdmin)
#05关联主机与账号密码
class BindHostAdmin(admin.ModelAdmin):
list_display = ['id','host','remote_user','memo','date']#显示字段表头
list_editable = ['host','remote_user','memo'] #可编辑
search_fields = ['host','remote_user','tag'] #搜索
filter_horizontal = ['tag'] #复选框
ordering = ['host','remote_user'] #自定义排序
admin.site.register(models.BindHost,BindHostAdmin)
#06主机分组
class HostGroupsAdmin(admin.ModelAdmin):
list_display = ['id','name','memo','date']#显示字段表头
list_editable = ['name','memo'] #可编辑
search_fields = ['name','tag'] #搜索
filter_horizontal = ['bind_hosts','tag'] #复选框
admin.site.register(models.HostGroups, HostGroupsAdmin)
#————————————————02堡垒机设计后台交互程序 结束————————————————
# ————————————————03堡垒机在Linux系统里记录会话日志 开始————————————————
#07会话日志
class SessionAdmin(admin.ModelAdmin):
list_display = ['id','user','bind_host','cmd_count','stay_time','closed','memo','date']#显示字段表头
list_editable = ['closed','memo'] #可编辑
search_fields = ['user','bind_host','memo','tag'] #搜索
filter_horizontal = ['tag'] #复选框
admin.site.register(models.Session, SessionAdmin)
# ————————————————03堡垒机在Linux系统里记录会话日志 结束————————————————

#admin.py

 #settings.py

 """
Django settings for eye project. Generated by 'django-admin startproject' using Django 2.1.4. For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/ For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
""" import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'r35s$()7lli1hw-!6%llp0uu$!m!e#nnlxu+&!6$(g*6f0=@2#' # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# ————————————————03堡垒机在Linux系统里记录会话日志 开始————————————————
# ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']
# ————————————————03堡垒机在Linux系统里记录会话日志 结束————————————————
# Application definition INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Fortress.apps.FortressConfig',
] MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] ROOT_URLCONF = 'eye.urls' TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
] WSGI_APPLICATION = 'eye.wsgi.application' # Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
} # Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
] # Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
#————————————————01堡垒机重写DJANGO账户表 开始————————————————
# ————Django中使用中国时区和中文 开始————
#LANGUAGE_CODE = 'en-us'
#TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
# ————Django中使用中国时区和中文 结束————
#————————————————01堡垒机重写DJANGO账户表 结束————————————————
USE_I18N = True USE_L10N = True
#————————————————01堡垒机重写DJANGO账户表 开始————————————————
# ————Django中跨时区 开始————
# USE_TZ = True
USE_TZ = False
# ————Django中跨时区 结束————
#————————————————01堡垒机重写DJANGO账户表 结束————————————————
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/ STATIC_URL = '/static/' #————————————————01堡垒机重写DJANGO账户表 开始————————————————
AUTH_USER_MODEL = 'Fortress.UserProfile'
#————————————————01堡垒机重写DJANGO账户表 结束————————————————

#settings.py


 """
————————创建跳板机的独立用户 开始————————
[root@localhost ~]# useradd jump |#新建用户(跳)
[root@localhost ~]# passwd jump |#修改用户(跳)的密码
新的 密码:admineye
重新输入新的 密码:admineye
————————创建跳板机的独立用户 结束————————
————————测试独立用户Django使用权限 开始————————
[root@localhost ~] su jump
[jump@localhost root]$ python3
>>> import django
>>> print(django.get_version())
2.1.4
>>> exit()
[jump@localhost root]$ su root
密码:123456
————————测试独立用户Django使用权限 结束————————
——虚拟机不用——————Luxin系统给独立用户Django使用权限 开始——site-packages——————
[root@localhost ~]# python3
>>> import sys
>>> sys.path
>>> exit()
[root@localhost ~]# sudo cp -rp /usr/lib64/anacnda3/lib/python3.6/site-packages/* /home/jump/.local/lib/python3.6/site-packages/
[root@localhost ~]# cd /home/jump/.local/lib/python3.6/site-packages/
[root@localhost ~]# sudo chown -R jump.jump *
[root@localhost ~]# ll
——虚拟机不用——————Luxin系统给独立用户Django使用权限 结束——site-packages——————
"""#独立用户

#独立用户

 """
E:\堡垒机\eye 将项目复制到 CentOS-7 的 /home/jump/ 目录下
———————复制Python代码到服务用户目录下 开始—————————
注意:修改settings中的设置,使其允许所有网段访问: ALLOWED_HOSTS = ['*']
[root@localhost ~]# cd /home/jump/eye
[root@localhost eye]# ls
[root@localhost eye]# python3 manage.py runserver 0.0.0.0:9000 |#运行服务时使用0.0.0.0:9000作为IP和端口,执行命令
[root@localhost ~]# systemctl stop firewalld.service |#注意:关闭防火墙
———————复制Python代码到服务用户目录下 结束————————— ———————测试项目交互脚本 开始—————————
[root@localhost ~]# python3 /home/jump/eye/fortess_manage.py
[root@localhost ~]# chmod -R 777 /home/jump |#修改权限,复制python项目文件到Luxin系统后注意重新赋值权限
———————测试项目交互脚本 结束—————————
"""#启动服务

#启动服务

 """
———————Windows系统测试 开始—————————
浏览器访问:http://192.192.168.143:9000/admin/
————putty测试 开始————
login as: jump
jump@192.192.168.143's password:admineye
----开始 运行交互脚本。。。----
Username:admin@qq.com
Password:admin123456
----------------------欢迎 admin-----------------------
0. 测试组[1]
z. 未分组主机[1]
admin>>:
————putty测试 结束————
———————Windows系统测试 结束—————————
"""#Windows系统测试

#Windows系统测试


 """
——————————session_tracker.sh给独立用户jump权限,创建日志免密码 开始——————————
[root@localhost ~]# vim /etc/sudoers
———————进入vim文本编辑操作 开始—————————
| i |#进入插入文本模式
_______到底部插入 开始_______
%jump ALL=NOPASSWD:ALL #/use/bin/strace,/usr/bin/python3
_______到底部插入 结束_______
| Esc |#退出插入文本模式
| Shift + Q |#进行EX操作模式
| wq! |#保存#退出vim文本编辑操作
———————进入vim文本编辑操作 结束—————————
——————————session_tracker.sh给独立用户jump权限,创建日志免密码 结束——————————
"""#创建日志

#创建日志


 """
————————配置独立用户启动项 开始————————
[root@localhost ~]# cd /home/jump
[root@localhost jump]# ls -a
. .. .bash_logout .bash_profile .bashrc
[root@localhost eye]# vim .bashrc
————如果vim打开错误 开始————
[root@localhost conf]# rpm -qa|grep vim |#如果vim打开错误
[root@localhost conf]# yum -y install vim* |#安装vim
————如果vim打开错误 结束————
————进入vim文本编辑操作 开始————
| i |#进入插入文本模式
_____原有的内容 开始_____
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
_____原有的内容 结束_____
_____插入的内容 开始_____
python3 /home/jump/eye/fortess_manage.py
logout
_____插入的内容 结束_____
| Esc |#退出插入文本模式
| Shift + Q |#进行EX操作模式
| w |#保存vim文本编辑操作
| q |#退出vim
————进入vim文本编辑操作 结束————
————————配置独立用户启动项 结束————————
"""#启动项

#启动项

Django项目:堡垒机(Linux服务器主机管理系统)--03--03堡垒机在Linux系统里记录会话日志02/02的更多相关文章

  1. Linux命令nohup实现命令后台运行并输出到或记录到日志文件

    Linux命令nohup实现命令后台运行并输出到或记录到日志文件 导读 我们在调试程序的时候,免不了要去抓一些 log ,然后进行分析.如果 log 量不是很大的话,那很简单,只需简单的复制粘贴就好. ...

  2. Django项目:堡垒机(Linux服务器主机管理系统)--02--02堡垒机设计后台交互程序

    #main.py #本文件写所有的连接交互动作程序 #————————————————02堡垒机设计后台交互程序 开始———————————————— from django.contrib.auth ...

  3. Django项目:堡垒机(Linux服务器主机管理系统)--01--01堡垒机重写DJANGO账户表

    python相关软件安装流程图解————————python安装——————python-3.7.1-amd64 https://www.cnblogs.com/ujq3/p/10098166.htm ...

  4. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  5. Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  6. Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  7. Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  8. Django项目:CRM(客户关系管理系统)--11--04PerfectCRM实现King_admin注册功能03

    #base_admin.py #Django admin 注册功能的形式 # sites = { # 'crm':{ # 'customers':CustomerAdmin, # 'customerf ...

  9. Django项目:CRM(客户关系管理系统)--05--02PerfectCRM创建ADMIN页面03

    /*! *bootstrap.js * * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. ...

随机推荐

  1. Mysql 查询表中某字段的重复值,删除重复值保留id最小的数据

    1 查询重复值 ); 2 删除重复值 -- 创建临时表 ) ); -- 把重复数据放进临时表 INSERT Hb_Student_a SELECT id,studentNumber FROM Hb_S ...

  2. zeromq protobuf例子

    https://github.com/AifiHenryMa/zeromq_protocolbuffer_demo https://github.com/protocolbuffers/protobu ...

  3. VMWare 禁用虚拟内存文件(*.vmem)

    1.使用 VMWare 虚拟机,虚拟机启动后,会在虚拟机目录下建立一个与虚拟内存大小相同的 .vmem文件,例如:564db13c-c92d-3d3a-41a0-f62af7536fda.vmem. ...

  4. BIO、NIO和AIO

    BIO(Blocking I/O)同步阻塞I/O 这是最基本与简单的I/O操作方式,其根本特性是做完一件事再去做另一件事,一件事一定要等前一件事做完,这很符合程序员传统的顺序来开发思想,因此BIO模型 ...

  5. 第一天:powershell外部命令

    首先我们应该怎样打开powershell呢?win+R,之后是一个运行窗口,在里面输入“powerhsell".按回车键,就可以打开powershell命令窗口了.当然也有其他方法打开,比如 ...

  6. filter的使用场景

    1.filter的使用场景:假如有一个对象数组A,获取数组中的指定类型的对象放到B数组中 我们在ES5先进行for循环遍历数组,再进行if 判断,如果数组中某个对象的类型符合要求,push 到一个新数 ...

  7. delphi DBGrid简单自绘(字体颜色、背景等)

    delphi DBGrid简单自绘(字体颜色.背景等)  从网上找的代码 应该是C#写的,其实delphi 的操作类似: 1 2 3 4 5 6 7 8 9 10 11 12 13 void __fa ...

  8. thinkphp 错误调试

    如果需要我们可以使用E方法输出错误信息并中断执行,例如: //输出错误信息,并中止执行 E($msg); 原3.1版本中的halt方法已经废弃,请使用E函数代替.

  9. 如何通过编程发现Java死锁

    本文由 ImportNew - rookie_sam 翻译自 Dzone.欢迎加入翻译小组.转载请见文末要求. 死锁是指,两个或多个动作一直在等待其他动作完成而使得所有动作都始终处在阻塞的状态.想要在 ...

  10. Api:temple

    ylbtech-Api: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cnb ...