Django項目:堡壘機(Linux服務器主機管理系統)--02--02堡壘機設計後臺交互程序

 

 

 

 

 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堡壘機設計後臺交互程序 結束————————————————
#main.py

 

 

 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堡壘機設計後臺交互程序 結束————————————————
#fortess_manage.py

 

 

 

 


 

 

 

 

 

 

  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 """
#models.py

 

 

 

 


 

 

 

 

  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堡壘機設計後臺交互程序 結束————————————————
#admin.py

 

 


 

 

 

 

 

 


 

 

 

 

 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堡壘機設計後臺交互程序 結束————————————————
#main.py

 

 

相關文章
相關標籤/搜索