1 #main.py 2 #本文件寫全部的鏈接交互動做程序 3 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 4 from django.contrib.auth import authenticate #驗證用戶的證書 5 import getpass#輸入密碼時不顯示密碼 6 #用戶登錄堡壘機後的交互程序 7 class HostManager(object): 8 def __init__(self): 9 self.user = None #當前帳號 10 11 def interactive(self):#交互腳本 12 # ————————————————登陸堡壘機 開始———————————————— 13 print("----開始 運行交互腳本----") 14 count = 0 #用戶名密碼試錯的次數 15 while count < 6:#用戶名密碼試錯的次數 16 username = input("請輸入你的用戶名:").strip()#用戶名 17 password = getpass.getpass("請輸入你的密碼:").strip()#密碼 18 user = authenticate(username=username,password=password)#驗證用戶名密碼 19 if user: #驗證成功 20 print("歡迎 %s 登錄使用!".center(50,'-') % user.name ) 21 self.user = user #驗證成功,賦值 22 break #退出無限循環 23 else: 24 print("用戶名或密碼錯誤!") 25 count += 1#用戶名密碼試錯的次數 26 else: 27 print("----結束 運行交互腳本----") 28 exit("用戶名密碼試錯的次數到了,再見。") 29 """ 30 #————從外部調用django的方法 開始———— 31 #注意寫,從外部調用django的方法 E:\堡壘機\eye\fortess_manage.py 32 #注意,到admin後臺配置主機給帳戶 33 # ———————————— 34 #運行 Terminal 35 #E:\堡壘機\eye>python fortess_manage.py 36 #Username:admin@qq.com 37 #Password:admin123456 38 #————從外部調用django的方法 結束———— 39 """ 40 # ————————————————登陸堡壘機 結束———————————————— 41 #————————————————02堡壘機設計後臺交互程序 結束————————————————
1 #fortess_manage.py 2 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 3 #————從外部調用django的方法 開始———— 4 import os #操做系統 5 if __name__ == "__main__": 6 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'eye.settings')#找路徑,環境變量 7 import django #導入django 8 django.setup()#安裝django 9 from Fortress.backend import main #從backend導入main.py 10 obj = main.HostManager() #實例化類#main.py的類 11 obj.interactive() #調用類的函數 #交互腳本 12 #————從外部調用django的方法 結束———— 13 #————————————————02堡壘機設計後臺交互程序 結束————————————————
1 #models.py 2 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 3 from django.db import models #模型 4 from django.contrib.auth.models import BaseUserManager,AbstractBaseUser,PermissionsMixin#DJANGO帳戶繼承重寫 5 #重寫DJAGO帳號表 6 class UserProfileManager(BaseUserManager): 7 def create_user(self, email, name, password=None):#建立並保存一個普通用戶給定的郵箱地址,密碼。 8 if not email: 9 raise ValueError('用戶必須有一個電子郵箱地址') 10 user = self.model(email=self.normalize_email(email),#驗證郵箱格式 11 name=name,)#建立一條普通用戶記錄 12 user.set_password(password)#對密碼加密 13 user.save(using=self._db)#從臨時文件讀取出來數據,進行保存。 14 return user 15 def create_superuser(self, email,name,password):#建立並保存一個超級用戶給定的郵箱地址,密碼。 16 user = self.create_user(email,name=name,password=password)#建立一條超級用戶記錄 17 user.is_admin = True#管理員 18 user.save(using=self._db)#從臨時文件讀取出來數據,進行保存。 19 return user 20 21 #重寫DJAGO帳號表 22 class UserProfile(AbstractBaseUser,PermissionsMixin): 23 # ————#DJANGO帳號必需要有的字段 開始———— 24 email = models.EmailField( max_length=255,unique=True,verbose_name='郵箱地址') 25 name = models.CharField(max_length=32,verbose_name='暱稱') 26 is_active = models.BooleanField(default=True,verbose_name='是否啓用') 27 is_admin = models.BooleanField(default=False,verbose_name='管理員',help_text='指定用戶是否能夠登陸管理網站而且擁有所有權限',) 28 is_staff = models.BooleanField(default=True,verbose_name='員工狀態',help_text='指定用戶是否能夠登陸管理網站',) 29 # ————#DJANGO帳號必需要有的字段 結束———— 30 31 # ————————————————02堡壘機設計後臺交互程序 開始———————————————— 32 bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="關聯的主機") 33 host_groups = models.ManyToManyField('HostGroups',blank=True,verbose_name="關聯的分組") 34 # ————————————————02堡壘機設計後臺交互程序 結束———————————————— 35 36 #————#建立用戶記錄 開始———— 37 objects = UserProfileManager()#建立用戶記錄,固定的變量名(objects) 38 USERNAME_FIELD = 'email' #用於登陸的字段 39 REQUIRED_FIELDS = ['name']#必須填寫 40 # ————#建立用戶記錄 結束———— 41 # ————#DJANGO帳號必需要有的方法 開始———— 42 def get_full_name(self):#用戶確認的電子郵件地址 43 return self.email 44 def get_short_name(self):#用戶確認的電子郵件地址 45 return self.email 46 # ————#DJANGO帳號必需要有的方法 結束———— 47 def __str__(self):# __unicode__ on Python 2 48 return self.email 49 # ————#DJANGO帳號權限 開始———— 50 def has_perm(self, perm, obj=None):#權限#用戶有一個特定的許可嗎? 51 return True 52 def has_module_perms(self, app_label):#用戶有權限查看應用名稱嗎? 53 return True 54 # ————#DJANGO帳號權限 結束———— 55 class Meta: 56 verbose_name_plural='00帳戶' 57 # ————自定製admin 開始———— 58 #到admin.py裏給DJANGO帳戶註冊顯示 #E:\堡壘機\eye\Fortress\admin.py 59 # ————自定製admin 結束———— 60 # ————註冊到配置文件 開始———— 61 #到配置文件裏給DJANGO帳戶指定模型 #E:\堡壘機\eye\eye\settings.py 62 #AUTH_USER_MODEL = 'web.UserProfile' 63 # ————註冊到配置文件 結束———— 64 #————————————————01堡壘機重寫DJANGO帳戶表 結束———————————————— 65 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 66 #01標籤 67 class Tag(models.Model): 68 name = models.CharField(max_length=64,unique=True) #標籤名#CharField定長文本#最長度=64字節#不能夠重複 69 class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據 70 verbose_name_plural = "01標籤" #verbose_name_plural給你的模型類起一個更可讀的名字 71 def __str__(self): # __str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。 72 return self.name # 返回 #標籤名 73 #02機房 74 class IDC(models.Model): 75 name = models.CharField(max_length=64, unique=True,verbose_name="機房名") 76 address=models.CharField(max_length=256,blank=True,null=True,verbose_name="機房地址") 77 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="機房的備註") 78 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 79 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 80 class Meta: 81 verbose_name_plural='02機房' 82 def __str__(self): 83 return self.name 84 #03主機 85 class Host(models.Model): 86 hostname = models.CharField(max_length=64,unique=True,verbose_name="主機名") 87 ip_addr = models.GenericIPAddressField(verbose_name="主機IP地址") 88 port = models.SmallIntegerField(default=22,verbose_name="主機端口") 89 idc = models.ForeignKey('IDC',blank=True,null=True,on_delete=models.CASCADE,verbose_name="主機所在的機房") 90 system_type_choices = ((0,'Linux'),(1,'Windows')) 91 system_type = models.SmallIntegerField(choices=system_type_choices,default=0,verbose_name="操做系統類型") 92 enabled = models.BooleanField(default=1,verbose_name="是否啓用本機") 93 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主機的備註") 94 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 95 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 96 class Meta: 97 verbose_name_plural='03主機' 98 unique_together = ('ip_addr','port') 99 def __str__(self): 100 return "%s(%s)" % (self.hostname, self.ip_addr) 101 #04帳號密碼 102 class RemoteUser(models.Model): 103 auth_type_choices =((0,'ssh-password'), (1,'ssh-key')) 104 auth_type = models.SmallIntegerField(choices=auth_type_choices,default=0,verbose_name="鏈接方式,密碼或者密鑰") 105 userlevel=models.CharField(max_length=128,blank=True,null=True,verbose_name="用戶等級") 106 username = models.CharField(max_length=128,verbose_name="用戶名") 107 password = models.CharField(max_length=256,verbose_name="密碼或者密鑰",help_text="若是鏈接方式選擇爲ssh-key,那此處就應該是key的路徑") 108 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="帳號密碼的備註") 109 host_prompt=models.ManyToManyField("Host",blank=True,verbose_name="可關聯的主機",help_text="關聯主機與帳號密碼提示") 110 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 111 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 112 class Meta: 113 verbose_name_plural='04帳號密碼' 114 unique_together = ('auth_type', 'username', 'password') # 聯合惟一 115 def __str__(self): 116 return "%s:%s:%s" %(self.id,self.username,self.memo) 117 #05關聯主機與帳號密碼 118 class BindHost(models.Model): 119 host = models.ForeignKey('Host',on_delete=models.CASCADE,verbose_name="遠程主機名") 120 remote_user = models.ForeignKey('RemoteUser',on_delete=models.CASCADE,verbose_name="遠程用戶名") 121 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="關聯的備註") 122 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 123 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 124 class Meta: 125 verbose_name_plural = '05關聯主機與帳號密碼' 126 unique_together = ('host', 'remote_user')#聯合惟一 127 def __str__(self): 128 return "<%s:%s:%s>" %(self.host.id,self.host.hostname,self.remote_user.username) 129 #06主機分組 130 class HostGroups(models.Model): 131 name = models.CharField(max_length=64,unique=True,verbose_name="分組名稱") 132 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主機分組的備註") 133 bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="遠程主機") 134 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 135 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 136 class Meta: 137 verbose_name_plural='06主機分組' 138 def __str__(self): 139 return self.name 140 #————————————————02堡壘機設計後臺交互程序 結束———————————————— 141 142 """ 143 # ————————————————Django中使用中國時區和中文 開始———————————————— 144 到settings.py裏修改#E:\堡壘機\eye\eye\settings.py 145 LANGUAGE_CODE = 'zh-Hans' 146 TIME_ZONE = 'Asia/Shanghai' 147 若是須要全局配置默認時區和語言,可在django下的conf模塊下的global_settings.py中進行配置 148 全部可選的語言選項可經過python輸入如下代碼查看: 149 from django.conf.locale import LANG_INFO 150 {key: LANG_INFO[key]['name_local'] for key in LANG_INFO if 'name_local' in LANG_INFO[key]} 151 # ————————時間擴展 開始———————— 152 USE_TZ = True 153 當設置了 USE_TZ 爲 True 時,Django 與其餘系統或服務的交流將強制使用 UTC 時間。 154 1.保證存儲到數據庫中的是 UTC 時間; 155 2.在函數之間傳遞時間參數時,確保時間已經轉換成 UTC 時間; 156 # ——Django中跨時區 開始—— 157 通常不跨時區的應用,能夠不使用時區,即在settings.py設置 158 USE_TZ = False 159 這樣存儲的時間就是無時區的時間。 160 # ——Django中跨時區 結束—— 161 # ————————時間擴展 結束———————— 162 # ————————————————Django中使用中國時區和中文 結束———————————————— 163 # ————————————————Django數據庫生成 開始———————————————— 164 運行 Terminal 165 生成 數據表 166 E:\堡壘機\eye>python manage.py makemigrations 167 數據表 遷移 168 E:\堡壘機\eye>python manage.py migrate 169 # ————————————————Django數據庫生成 結束———————————————— 170 # ————————————————重寫Django帳號表後的建立方法 開始———————————————— 171 E:\堡壘機\eye>python manage.py createsuperuser 172 郵箱地址: admin@qq.com 173 暱稱: admin 174 Password: admin123456 175 Password (again): admin123456 176 Superuser created successfully. 177 # ————————————————重寫Django帳號表後的建立方法 結束———————————————— 178 #啓動 DJANGO 服務 179 E:\堡壘機\eye>python manage.py runserver 127.0.0.1:8000 180 """
1 #admin.py 2 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 3 #————————同目錄下能夠用 . 開始———————— 4 #from Fortress import models#數據庫 #重寫DJAGO帳號表 5 from . import models#數據庫 #重寫DJAGO帳號表 6 #————————同目錄下能夠用 . 結束———————— 7 from django import forms #django的字段驗證 8 from django.contrib.auth.admin import UserAdmin as BaseUserAdmin ##表單添加和更改用戶實例 9 from django.contrib.auth.forms import ReadOnlyPasswordHashField#只讀密碼散列字段 10 from django.contrib import admin #註冊類到admin 11 #建立新用戶 12 class UserCreationForm(forms.ModelForm): 13 password1 = forms.CharField(label='設置密碼', widget=forms.PasswordInput)#密碼 14 password2 = forms.CharField(label='確認密碼', widget=forms.PasswordInput)#確認密碼 15 class Meta: 16 model = models.UserProfile 17 fields = ['email', 'name'] 18 def clean_password2(self): #檢查兩個密碼條目是否同樣(匹配) 19 password1 = self.cleaned_data.get("password1") 20 password2 = self.cleaned_data.get("password2") 21 if password1 and password2 and password1 != password2: 22 raise forms.ValidationError("密碼不匹配") 23 return password2 24 def save(self, commit=True): #保存密碼(散列的格式提供) 25 user = super(UserCreationForm, self).save(commit=False) 26 user.set_password(self.cleaned_data["password1"]) 27 if commit: 28 user.save()#保存 29 return user 30 # 修改用戶密碼 31 class UserChangeForm(forms.ModelForm): 32 password = ReadOnlyPasswordHashField(label="修改密碼", 33 help_text=("原始密碼不存儲,因此沒有辦法看到" 34 "這個用戶的密碼,可是你能夠改變密碼 " 35 "使用 <a href=\"../password/\">修改密碼</a>."))#哈值#只讀密碼散列字段 36 class Meta: 37 model = models.UserProfile 38 fields = ['email', 'password', 'name', 'is_active', 'is_admin'] 39 def clean_password(self):#無論用戶提供什麼,返回初始值。 40 return self.initial["password"] 41 42 #表單添加和更改用戶實例 43 class UserProfileAdmin(BaseUserAdmin): 44 form = UserChangeForm #修改 45 add_form = UserCreationForm#建立 46 # 字段用於顯示用戶模型。 47 # 這些覆蓋定義UserAdmin固定在底座上 48 # auth.User參考特定字段。 49 list_display = ['email', 'name','is_staff', 'is_admin']#後臺顯示的字段 50 list_filter = ['is_admin','is_staff']#後臺過濾的字段 51 fieldsets = (('帳號密碼', {'fields': ('email', 'password')}), 52 ('我的信息', {'fields': ('name',)}), 53 # ————————————————02堡壘機設計後臺交互程序 開始———————————————— 54 ('堡壘機主機受權', {'fields': ('bind_hosts', 'host_groups')}), 55 # ————————————————02堡壘機設計後臺交互程序 結束———————————————— 56 ('權限', {'fields': ('is_admin','is_staff','user_permissions','groups')}),) 57 #添加帳戶時顯示要填寫的字段 58 add_fieldsets = (('添加帳戶', {'classes': ('wide',),#wide(寬屏樣式) 59 'fields': ('email', 'name', 'password1', 'password2')}),) 60 search_fields = ['email']#後臺搜索的字段 61 ordering = ['email']#後臺排序的字段 62 filter_horizontal =['user_permissions','groups',#必須覆蓋的變量#後臺複選框的字段 63 # ————————————————02堡壘機設計後臺交互程序 開始———————————————— 64 'bind_hosts', 'host_groups', 65 # ————————————————02堡壘機設計後臺交互程序 結束———————————————— 66 ] 67 admin.site.register(models.UserProfile, UserProfileAdmin)#如今註冊這個新UserProfileAdmin 68 # ——可選——使用Django的內置權限 開始———— 69 #from django.contrib.auth.models import Group #權限組 70 #admin.site.unregister(Group)#權限組#由於咱們不使用Django的內置權限, 71 # ——可選——使用Django的內置權限 結束———— 72 #————————————————01堡壘機重寫DJANGO帳戶表 結束———————————————— 73 74 75 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 76 #01標籤 77 class TagAdmin(admin.ModelAdmin): 78 list_display = ['id','name'] #顯示字段表頭 79 list_editable = ['name'] #可編輯 80 search_fields = ['name'] #搜索 81 admin.site.register(models.Tag, TagAdmin) 82 #02機房 83 class IDCAdmin(admin.ModelAdmin): 84 list_display = ['id','name','address','memo','date'] #顯示字段表頭 85 list_editable = ['name','address', 'memo'] #可編輯 86 search_fields = ['name','tag'] #搜索 87 filter_horizontal = ['tag'] #複選框 88 admin.site.register(models.IDC, IDCAdmin) 89 #03主機 90 class HostAdmin(admin.ModelAdmin): 91 list_display = ['id','hostname','ip_addr','port','memo','enabled','date'] #顯示字段表頭 92 list_editable = ['hostname','ip_addr','port','memo','enabled'] #可編輯 93 search_fields = ['hostname','ip_addr','port','tag'] #搜索 94 filter_horizontal = ['tag'] #複選框 95 admin.site.register(models.Host, HostAdmin) 96 #04帳號密碼 97 class RemoteUserAdmin(admin.ModelAdmin): 98 list_display = ['id','userlevel','username','memo','date'] #顯示字段表頭 99 list_editable = ['memo'] #可編輯 100 search_fields = ['userlevel','username','tag'] #搜索 101 filter_horizontal = ['host_prompt','tag'] #複選框 102 admin.site.register(models.RemoteUser,RemoteUserAdmin) 103 #05關聯主機與帳號密碼 104 class BindHostAdmin(admin.ModelAdmin): 105 list_display = ['id','host','remote_user','memo','date']#顯示字段表頭 106 list_editable = ['host','remote_user','memo'] #可編輯 107 search_fields = ['host','remote_user','tag'] #搜索 108 filter_horizontal = ['tag'] #複選框 109 ordering = ['host','remote_user'] #自定義排序 110 admin.site.register(models.BindHost,BindHostAdmin) 111 #06主機分組 112 class HostGroupsAdmin(admin.ModelAdmin): 113 list_display = ['id','name','memo','date']#顯示字段表頭 114 list_editable = ['name','memo'] #可編輯 115 search_fields = ['name','tag'] #搜索 116 filter_horizontal = ['bind_hosts','tag'] #複選框 117 admin.site.register(models.HostGroups, HostGroupsAdmin) 118 #————————————————02堡壘機設計後臺交互程序 結束————————————————
1 #main.py 2 #本文件寫全部的鏈接交互動做程序 3 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 4 from django.contrib.auth import authenticate #驗證用戶的證書 5 #用戶登錄堡壘機後的交互程序 6 class HostManager(object): 7 def __init__(self): 8 self.user = None #當前帳號 9 def interactive(self):#交互腳本 10 # ————————————————登陸堡壘機 開始———————————————— 11 print("----開始 運行交互腳本----") 12 count = 0 #用戶名密碼試錯的次數 13 while count < 6:#用戶名密碼試錯的次數 14 username = input("Username:").strip()#用戶名 15 password = input("Password:").strip()#密碼 16 user = authenticate(username=username,password=password)#驗證用戶名密碼 17 if user: #驗證成功 18 print("歡迎 %s 登錄使用!".center(50,'-') % user.name ) 19 self.user = user #驗證成功,賦值 20 break #退出無限循環 21 else: 22 print("用戶名或密碼錯誤!") 23 count += 1#用戶名密碼試錯的次數 24 else: 25 print("----結束 運行交互腳本----") 26 exit("用戶名密碼試錯的次數到了,再見。") 27 """ 28 #————從外部調用django的方法 開始———— 29 #注意寫,從外部調用django的方法 E:\堡壘機\eye\fortess_manage.py 30 #注意,到admin後臺配置主機給帳戶 31 # ———————————— 32 #運行 Terminal 33 #E:\堡壘機\eye>python fortess_manage.py 34 #Username:admin@qq.com 35 #Password:admin123456 36 #————從外部調用django的方法 結束———— 37 """ 38 # ————————————————登陸堡壘機 結束———————————————— 39 # ——————————————選擇要鏈接的主機 開始———————————— 40 if self.user: #驗證登陸成功 41 while True: 42 #————————打印當前帳戶全部的能夠登陸主機 開始—————— 43 for index,host_group in enumerate(self.user.host_groups.all()): #select_related() 44 print("%s.\t%s[%s]" %(index,host_group.name, host_group.bind_hosts.count())) 45 print("z.\t未分組主機[%s]" %(self.user.bind_hosts.count())) 46 #————————打印當前帳戶全部的能夠登陸主機 結束—————— 47 # ————————開始選擇分組 開始—————— 48 choice = input("%s>>:"% self.user).strip()#輸入選擇 49 if len(choice) == 0:#長度等於0 50 continue#跳過此次循環 51 selected_host_group = None #選擇分組 52 if choice.isdigit():#檢測字符串是否只由數字組成 53 choice = int(choice)#轉成整數 54 if choice >=0 and choice <= index: #判斷輸入的選項是否合法 55 selected_host_group = self.user.host_groups.all()[choice]#迭代選擇分組 56 elif choice == 'z':#未分組 57 selected_host_group = self.user 58 # ————————開始選擇分組 結束—————— 59 # ————————開始選擇主機 開始—————— 60 if selected_host_group: #選擇分組後選擇主機 61 while True: 62 print("當前選擇的分組: %s ".center(50,'-') %selected_host_group) 63 # ————————打印分組裏的全部主機 開始—————— 64 for index, bind_host in enumerate(selected_host_group.bind_hosts.all()): 65 print("%s.\t%s" % (index, bind_host)) 66 print("返回上級菜單,請按 b ") 67 # ————————打印分組裏的全部主機 結束—————— 68 # ————————選擇分組裏的主機 開始—————— 69 choice = input("%s>>>:" % self.user).strip()#輸入選擇 70 if choice.isdigit():#檢測字符串是否只由數字組成 71 choice = int(choice)#轉成整數 72 if choice >= 0 and choice <= index:#判斷輸入的選項是否合法 73 bind_host = selected_host_group.bind_hosts.all()[choice]#迭代選擇主機 74 print("準備登陸 %s 主機".center(50,'-') %bind_host) 75 # ————————選擇分組裏的主機 結束—————— 76 elif choice == 'b':#退出 77 break #終止無限循環 78 # ————————開始選擇主機 結束—————— 79 # ——————————————選擇要鏈接的主機 結束———————————— 80 #————————————————02堡壘機設計後臺交互程序 結束————————————————