Django項目:堡壘機(Linux服務器主機管理系統)--03--03堡壘機在Linux系統裏記錄會話日誌02/02

 

 

 

  1 #main.py
  2 #本文件寫全部的鏈接交互動做程序
  3 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始————————————————
  4 from Fortress import models #數據庫
  5 import subprocess#系統交互#subprocess模塊容許咱們建立子進程,鏈接他們的輸入/輸出/錯誤管道,還有得到返回值。
  6 import uuid #通用惟一識別碼
  7 import os #系統
  8 BASE_DIR = os.path.dirname(os.path.abspath(__file__))# 動態路徑,當前文件的父目錄
  9 #E:\堡壘機\eye\Fortress\backend
 10 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
 11 #————————————————02堡壘機設計後臺交互程序 開始————————————————
 12 from django.contrib.auth import authenticate #驗證用戶的證書
 13 import getpass#輸入密碼時不顯示密碼
 14 #用戶登錄堡壘機後的交互程序
 15 class HostManager(object):
 16     def __init__(self):
 17         self.user = None #當前帳號
 18     # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始————————————————
 19     def get_session_id(self,bind_host_obj,uuid):#建立應用會話的id
 20         print('建立新的會話:',self.user.id,bind_host_obj,uuid)
 21         session_obj = models.Session(user_id = self.user.id,bind_host=bind_host_obj,uuid=uuid)#建立數據庫
 22         session_obj.save()#會話保存
 23         print('新的會話的ID:',session_obj.id)
 24         return session_obj#返回會話
 25     # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
 26     def interactive(self):#交互腳本
 27         # ————————————————登陸堡壘機 開始————————————————
 28         print("----開始 運行交互腳本----")
 29         count = 0 #用戶名密碼試錯的次數
 30         while count < 6:#用戶名密碼試錯的次數
 31             username = input("請輸入你的用戶名:").strip()#用戶名
 32             password = getpass.getpass("請輸入你的密碼:").strip()#密碼
 33             user = authenticate(username=username,password=password)#驗證用戶名密碼
 34             if user: #驗證成功
 35                 print("歡迎 %s 登錄使用!".center(50,'-') % user.name )
 36                 self.user = user #驗證成功,賦值
 37                 break #退出無限循環
 38             else:
 39                 print("用戶名或密碼錯誤!")
 40             count += 1#用戶名密碼試錯的次數
 41         else:
 42             print("----結束 運行交互腳本----")
 43             exit("用戶名密碼試錯的次數到了,再見。")
 44         """
 45         #————從外部調用django的方法 開始————
 46         #注意寫,從外部調用django的方法 E:\堡壘機\eye\fortess_manage.py
 47         #注意,到admin後臺配置主機給帳戶
 48         # ————————————
 49         #運行 Terminal
 50         #E:\堡壘機\eye>python fortess_manage.py
 51         #Username:admin@qq.com
 52         #Password:admin123456
 53         #————從外部調用django的方法 結束————
 54         """
 55         # ————————————————登陸堡壘機 結束————————————————
 56         # ——————————————選擇要鏈接的主機 開始————————————
 57         if self.user: #驗證登陸成功
 58             while True:
 59                 #————————打印當前帳戶全部的能夠登陸主機 開始——————
 60                 for index,host_group  in enumerate(self.user.host_groups.all()): #select_related()
 61                     print("%s.\t%s[%s]" %(index,host_group.name, host_group.bind_hosts.count()))
 62                 print("z.\t未分組主機[%s]" %(self.user.bind_hosts.count()))
 63                 #————————打印當前帳戶全部的能夠登陸主機 結束——————
 64                 # ————————開始選擇分組 開始——————
 65                 choice = input("%s>>:"% self.user).strip()#輸入選擇
 66                 if len(choice) == 0:#長度等於0
 67                     continue#跳過此次循環
 68                 selected_host_group = None #選擇分組
 69                 if choice.isdigit():#檢測字符串是否只由數字組成
 70                     choice = int(choice)#轉成整數
 71                     if choice >=0 and choice <= index: #判斷輸入的選項是否合法
 72                         selected_host_group = self.user.host_groups.all()[choice]#迭代選擇分組
 73                 elif choice == 'z':#未分組
 74                     selected_host_group = self.user
 75                 # ————————開始選擇分組 結束——————
 76                 # ————————開始選擇主機 開始——————
 77                 if selected_host_group: #選擇分組後選擇主機
 78                     while True:
 79                         print("當前選擇的分組: %s ".center(50,'-') %selected_host_group)
 80                         # ————————打印分組裏的全部主機 開始——————
 81                         for index, bind_host in enumerate(selected_host_group.bind_hosts.all()):
 82                             print("%s.\t%s" % (index, bind_host))
 83                         print("返回上級菜單,請按  b  ")
 84                         # ————————打印分組裏的全部主機 結束——————
 85                         # ————————選擇分組裏的主機 開始——————
 86                         choice = input("%s>>>:" % self.user).strip()#輸入選擇
 87                         if choice.isdigit():#檢測字符串是否只由數字組成
 88                             choice = int(choice)#轉成整數
 89                             if choice >= 0 and choice <= index:#判斷輸入的選項是否合法
 90                                 bind_host = selected_host_group.bind_hosts.all()[choice]#迭代選擇主機
 91                                 print("準備登陸 %s 主機".center(50,'-') %bind_host)
 92                         # ————————選擇分組裏的主機 結束——————
 93                                 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始————————————————
 94                                 if bind_host.host.enabled:#是否啓用了此主機
 95                                     ssh_uuid = uuid.uuid4()  # 惟一標識
 96                                     session_obj = self.get_session_id(bind_host, ssh_uuid)  # 建立應用會話的id
 97                                     print("建立會話審計記錄,用ID關聯shell腳本建立的文件名:", session_obj)
 98                                     # ————————在Linux系統下打開新進程的shell監控腳本 開始————————
 99                                     monitor_script = subprocess.Popen("sh %s/session_tracker.sh %s %s"
100                                                                       % (BASE_DIR,  # 動態路徑,當前文件的父目錄
101                                                                          ssh_uuid,  # 惟一標識
102                                                                          session_obj.id),#新的會話的ID
103                                                                          shell=True,#若是把shell設置成True,指定的命令會在shell裏解釋執行。
104                                                                          stdout=subprocess.PIPE,  # subprocess 實現管道( pipe )交互操做讀/寫通訊
105                                                                          stderr=subprocess.PIPE)  # stdout, stdin, stderr的中文名字分別是標準輸出,標準輸入和標準錯誤。
106                                     print('監控執行的腳本:', monitor_script)
107                                     # print('讀取標準錯誤,很慢,測試時才用:',monitor_script.stderr.read())
108                                     # ————————在Linux系統下打開新進程的shell監控腳本 結束————————
109                                     # ————————只能在Linux系統下運行 開始————————
110                                     print('準備鏈接遠程主機......')
111                                     cmd_str = "sshpass -p %s ssh -p %s %s@%s -E %s -o StrictHostKeyChecking=no" % (
112                                         bind_host.remote_user.password,  # 登陸的密碼
113                                         bind_host.host.port,  # 登陸的IP端口
114                                         bind_host.remote_user.username,  # 登陸的帳號
115                                         bind_host.host.ip_addr,  # 登陸的IP地址
116                                         ssh_uuid)  # 惟一標識
117                                     # sshpass 能夠在命令行直接使用密碼來進行遠程鏈接和遠程拉取文件。只能在Linux系統下運行。
118                                     #  -E 臨時文件名 -o StrictHostKeyChecking=no 忽略登錄確認提示
119                                     print('要執行的命令:', cmd_str)#實際生產時關閉
120                                     # 要執行的命令: sshpass -p 123456 ssh -p 22  root@192.192.168.127 -E a1255ca0-2ed8-4a56-866b-758e96d871d5 -o StrictHostKeyChecking=no
121                                     subprocess.run(cmd_str, shell=True)  # 只能在Linux系統下運行
122                                     # ————————只能在Linux系統下運行 結束————————
123                                 else:
124                                     print('此主機未啓用,請聯繫管理員!!')
125                                 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
126                         elif choice == 'b':#退出
127                             break #終止無限循環
128                 # ————————開始選擇主機 結束——————
129         # ——————————————選擇要鏈接的主機 結束————————————
130 #————————————————02堡壘機設計後臺交互程序 結束————————————————
131 
132 
133 
134 """
135 ————————安裝django 開始————————
136 login as: root 
137 root@192.192.168.126's password: 123456
138 [root@localhost ~]# python3
139 >>> import django
140 >>> exit()
141 [root@localhost ~]# pip3 install --upgrade pip
142 [root@localhost ~]# pip3 install --default-timeout=1000 Django==2.1.4
143 [root@localhost ~]# python3
144 >>> import django
145 >>> print(django.get_version())
146 2.1.4
147 >>> exit()
148 ————————安裝django 結束————————
149 """#安裝django
150 """
151 ————————安裝strace跟蹤線程 開始————————
152 [root@localhost ~]# yum -y install strace           
153 [root@localhost ~]# ssh root@192.192.168.110        |
154 root@192.192.168.110's password:123456              |
155                                                     | [root@localhost ~]# ps -ef
156                                                     | UID        PID  PPID  C STIME TTY          TIME CMD
157                                                     | root      5999  5936  0 08:06 pts/2    00:00:00 ssh root@192.192.168.110
158                                                     | [root@localhost ~]# sudo strace -p 5999
159 [root@localhost ~]# l                               | read(4, "l", 16384)                     = 1
160                                                     | [root@localhost ~]# sudo strace -p 5999 -o eye.log
161 [root@localhost ~]# A                               | 
162                                                     | [root@localhost ~]# cat eye.log                                    
163                                                     | [root@localhost ~]# cat eye.log |grep 'read(4'
164                                                     | read(4, "A", 16384)                     = 1
165 ————————安裝strace跟蹤線程 結束————————
166 """#安裝strace跟蹤線程
167 """
168 ————————sshpass能夠在命令行直接使用密碼來進行遠程鏈接和遠程拉取文件 開始————————
169 [root@localhost ~]# yum -y install sshpass
170 [root@localhost ~]# sshpass -p 123456 ssh -p 22 root@192.192.168.110
171 [root@localhost ~]# ip addr
172 ————————用python調用sshpass 開始————————
173 [root@localhost ~]# python3
174 >>> import subprocess
175 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -o StrictHostKeyChecking=no",shell=True)
176 ————————另啓一個會話查看————————
177 [root@localhost ~]# ps -ef
178 UID        PID  PPID  C STIME TTY          TIME CMD
179 root      5147  5146  0 09:41 pts/8    00:00:00 ssh root@192.192.168.110 -o StrictHostKeyCh
180 [root@localhost ~]# sudo strace -fp 5147 -t -o eye.log
181 [root@localhost ~]# cat eye.log  
182 ————獲取進程號 開始————
183 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110'
184 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh
185 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass
186 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass | awk '{ print $2 }'
187 ————獲取進程號 結束————
188 ————————用python調用sshpass 結束————————
189 ————————sshpass能夠在命令行直接使用密碼來進行遠程鏈接和遠程拉取文件 結束————————
190 """#sshpass
191 """
192 ————————獲取進程號,惟一標識 開始————————
193 [root@localhost ~]# python3
194 >>> import subprocess
195 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs123 -o StrictHostKeyChecking=no",shell=True)
196 ————————另啓一個登錄會話————————
197 [root@localhost ~]# python3
198 >>> import subprocess
199 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs456 -o StrictHostKeyChecking=no",shell=True)
200 ————————另啓一個會話查看————————
201 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass | grep  wybs123 | awk '{ print $2 }'    
202 [root@localhost ~]# ps -ef | grep  wybs123 | grep ssh | grep -v sshpass | awk '{ print $2 }'    
203 ————————獲取進程號,惟一標識  結束————————
204 """#獲取進程號
205 """
206 E:\堡壘機\eye\Fortress\backend\session_tracker.sh 複製到 CentOS-7 的 /home/ 目錄下
207 ————————SH腳本測試 開始————————
208 [root@localhost ~]# sh /home/session_tracker.sh 
209 [root@localhost ~]# sh /home/session_tracker.sh wybs123 99 
210 ————————SH腳本測試 結束————————
211 ————————用python3測試SH腳本 開始————————
212 [root@localhost ~]# python3
213 >>> import subprocess
214 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs123 -o StrictHostKeyChecking=no",shell=True)
215 ————————另啓一個會話查看————————
216 [root@localhost ~]# ps -ef | grep  wybs123 | grep ssh | grep -v sshpass | awk '{ print $2 }' 
217 [root@localhost ~]# sh /home/session_tracker.sh wybs123 99 
218 ————————用python3測試SH腳本 結束————————
219 """#SH腳本測試
220 """
221 ————————建立跳板機的獨立用戶 開始————————
222 [root@localhost ~]# useradd jump |#新建用戶(跳)      
223 [root@localhost ~]# passwd jump  |#修改用戶(跳)的密碼
224 新的 密碼:admineye
225 從新輸入新的 密碼:admineye
226 ————————建立跳板機的獨立用戶 結束————————
227 ————————測試獨立用戶Django使用權限 開始————————
228 [root@localhost ~] su jump
229 [jump@localhost root]$ python3
230 >>> import django
231 >>> print(django.get_version())
232 2.1.4
233 >>> exit()
234 [jump@localhost root]$ su root
235 密碼:123456
236 ————————測試獨立用戶Django使用權限 結束————————
237 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 開始——site-packages——————
238 [root@localhost ~]# python3
239 >>> import sys
240 >>> sys.path
241 >>> exit()
242 [root@localhost ~]# sudo cp -rp /usr/lib64/anacnda3/lib/python3.6/site-packages/* /home/jump/.local/lib/python3.6/site-packages/
243 [root@localhost ~]# cd /home/jump/.local/lib/python3.6/site-packages/
244 [root@localhost ~]# sudo chown -R jump.jump *
245 [root@localhost ~]# ll
246 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 結束——site-packages——————
247 """#獨立用戶
248 """
249 E:\堡壘機\eye 將項目複製到 CentOS-7 的 /home/jump/ 目錄下
250 ———————複製Python代碼到服務用戶目錄下 開始—————————
251 注意:修改settings中的設置,使其容許全部網段訪問: ALLOWED_HOSTS = ['*']
252 [root@localhost ~]# cd /home/jump/eye
253 [root@localhost eye]# ls
254 [root@localhost eye]# python3 manage.py runserver 0.0.0.0:9000 |#運行服務時使用0.0.0.0:9000做爲IP和端口,執行命令
255 [root@localhost ~]# systemctl stop firewalld.service |#注意:關閉防火牆 
256 ———————複製Python代碼到服務用戶目錄下 結束—————————
257 
258 ———————測試項目交互腳本 開始—————————
259 [root@localhost ~]# python3 /home/jump/eye/fortess_manage.py
260 [root@localhost ~]# chmod -R 777 /home/jump |#修改權限,複製python項目文件到Luxin系統後注意從新賦值權限
261 ———————測試項目交互腳本 結束—————————
262 """#啓動服務
263 """
264 ———————Windows系統測試 開始—————————
265 瀏覽器訪問:http://192.192.168.143:9000/admin/
266 ————putty測試 開始————
267 login as: jump
268 jump@192.192.168.143's password:admineye
269 ----開始 運行交互腳本。。。----
270 Username:admin@qq.com
271 Password:admin123456
272 ----------------------歡迎 admin-----------------------
273 0.      測試組[1]
274 z.      未分組主機[1]
275 admin>>:
276 ————putty測試 結束————
277 ———————Windows系統測試 結束—————————
278 """#Windows系統測試
279 """
280 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 開始——————————
281 [root@localhost ~]# vim /etc/sudoers
282 ———————進入vim文本編輯操做 開始—————————
283 | i |#進入插入文本模式
284 _______到底部插入 開始_______
285 %jump  ALL=NOPASSWD:ALL #/use/bin/strace,/usr/bin/python3
286 _______到底部插入 結束_______
287 | Esc |#退出插入文本模式
288 | Shift + Q  |#進行EX操做模式
289 | wq! |#保存#退出vim文本編輯操做
290 ———————進入vim文本編輯操做 結束—————————
291 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 結束——————————
292 """#建立日誌
293 """
294 ————————配置獨立用戶啓動項 開始————————
295 [root@localhost ~]# cd /home/jump
296 [root@localhost jump]# ls -a
297 .  ..  .bash_logout  .bash_profile  .bashrc
298 [root@localhost eye]# vim .bashrc
299 ————若是vim打開錯誤 開始————
300 [root@localhost conf]# rpm -qa|grep vim     |#若是vim打開錯誤
301 [root@localhost conf]# yum -y install vim*  |#安裝vim
302 ————若是vim打開錯誤 結束————
303 ————進入vim文本編輯操做 開始————
304 | i |#進入插入文本模式
305 _____原有的內容 開始_____
306 if [ -f /etc/bashrc ]; then
307         . /etc/bashrc
308 fi
309 _____原有的內容 結束_____
310 _____插入的內容 開始_____
311 python3 /home/jump/eye/fortess_manage.py
312 logout
313 _____插入的內容 結束_____
314 | Esc |#退出插入文本模式
315 | Shift + Q  |#進行EX操做模式
316 | w |#保存vim文本編輯操做
317 | q |#退出vim
318 ————進入vim文本編輯操做 結束————
319 ————————配置獨立用戶啓動項 結束————————
320 """#啓動項
321 """
322 ———————複製Python代碼,後快速啓動服務 開始—————————
323 [root@localhost ~]# chmod -R 777 /home/jump |#修改權限,複製python項目文件到Luxin系統後注意從新賦值權限
324 [root@localhost ~]# python3 /home/jump/eye/manage.py runserver 0.0.0.0:9000
325 ———————複製Python代碼,後快速啓動服務 結束—————————
326 """#快速啓動服務
#main.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 #重寫DJAGO帳號表
 21 class UserProfile(AbstractBaseUser,PermissionsMixin):
 22     # ————#DJANGO帳號必需要有的字段 開始————
 23     email = models.EmailField( max_length=255,unique=True,verbose_name='郵箱地址')
 24     name = models.CharField(max_length=32,verbose_name='暱稱')
 25     is_active = models.BooleanField(default=True,verbose_name='是否啓用')
 26     is_admin = models.BooleanField(default=False,verbose_name='管理員',help_text='指定用戶是否能夠登陸管理網站而且擁有所有權限',)
 27     is_staff = models.BooleanField(default=True,verbose_name='員工狀態',help_text='指定用戶是否能夠登陸管理網站',)
 28     # ————#DJANGO帳號必需要有的字段 結束————
 29 
 30     # ————————————————02堡壘機設計後臺交互程序 開始————————————————
 31     bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="關聯的主機")
 32     host_groups = models.ManyToManyField('HostGroups',blank=True,verbose_name="關聯的分組")
 33     # ————————————————02堡壘機設計後臺交互程序 結束————————————————
 34 
 35     #————#建立用戶記錄 開始————
 36     objects = UserProfileManager()#建立用戶記錄,固定的變量名(objects)
 37     USERNAME_FIELD = 'email' #用於登陸的字段
 38     REQUIRED_FIELDS = ['name']#必須填寫
 39     # ————#建立用戶記錄 結束————
 40     # ————#DJANGO帳號必需要有的方法 開始————
 41     def get_full_name(self):#用戶確認的電子郵件地址
 42         return self.email
 43     def get_short_name(self):#用戶確認的電子郵件地址
 44         return self.email
 45     # ————#DJANGO帳號必需要有的方法 結束————
 46     def __str__(self):# __unicode__ on Python 2
 47         return self.email
 48     # ————#DJANGO帳號權限 開始————
 49     def has_perm(self, perm, obj=None):#權限#用戶有一個特定的許可嗎?
 50         return True
 51     def has_module_perms(self, app_label):#用戶有權限查看應用名稱嗎?
 52         return True
 53     # ————#DJANGO帳號權限 結束————
 54     class Meta:
 55         verbose_name_plural='00帳戶'
 56 # ————自定製admin 開始————
 57 #到admin.py裏給DJANGO帳戶註冊顯示 #E:\堡壘機\eye\Fortress\admin.py
 58 # ————自定製admin 結束————
 59 # ————註冊到配置文件 開始————
 60 #到配置文件裏給DJANGO帳戶指定模型 #E:\堡壘機\eye\eye\settings.py
 61 #AUTH_USER_MODEL = 'web.UserProfile'
 62 # ————註冊到配置文件 結束————
 63 #————————————————01堡壘機重寫DJANGO帳戶表 結束————————————————
 64 #————————————————02堡壘機設計後臺交互程序 開始————————————————
 65 #01標籤
 66 class Tag(models.Model):
 67     name =  models.CharField(max_length=64,unique=True) #標籤名#CharField定長文本#最長度=64字節#不能夠重複
 68     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
 69         verbose_name_plural =  "01標籤" #verbose_name_plural給你的模型類起一個更可讀的名字
 70     def __str__(self):  # __str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
 71         return self.name  # 返回 #標籤名
 72 #02機房
 73 class IDC(models.Model):
 74     name = models.CharField(max_length=64, unique=True,verbose_name="機房名")
 75     address=models.CharField(max_length=256,blank=True,null=True,verbose_name="機房地址")
 76     memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="機房的備註")
 77     tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表
 78     date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間')
 79     class Meta:
 80         verbose_name_plural='02機房'
 81     def __str__(self):
 82         return self.name
 83 #03主機
 84 class Host(models.Model):
 85     hostname = models.CharField(max_length=64,unique=True,verbose_name="主機名")
 86     ip_addr = models.GenericIPAddressField(verbose_name="主機IP地址")
 87     port = models.SmallIntegerField(default=22,verbose_name="主機端口")
 88     idc = models.ForeignKey('IDC',blank=True,null=True,on_delete=models.CASCADE,verbose_name="主機所在的機房")
 89     system_type_choices = ((0,'Linux'),(1,'Windows'))
 90     system_type = models.SmallIntegerField(choices=system_type_choices,default=0,verbose_name="操做系統類型")
 91     enabled = models.BooleanField(default=1,verbose_name="是否啓用本機")
 92     memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主機的備註")
 93     tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表
 94     date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間')
 95     class Meta:
 96         verbose_name_plural='03主機'
 97         unique_together = ('ip_addr','port')
 98     def __str__(self):
 99         return "%s(%s)" % (self.hostname, self.ip_addr)
100 #04帳號密碼
101 class RemoteUser(models.Model):
102     auth_type_choices =((0,'ssh-password'), (1,'ssh-key'))
103     auth_type = models.SmallIntegerField(choices=auth_type_choices,default=0,verbose_name="鏈接方式,密碼或者密鑰")
104     userlevel=models.CharField(max_length=128,blank=True,null=True,verbose_name="用戶等級")
105     username = models.CharField(max_length=128,verbose_name="用戶名")
106     password = models.CharField(max_length=256,verbose_name="密碼或者密鑰",help_text="若是鏈接方式選擇爲ssh-key,那此處就應該是key的路徑")
107     memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="帳號密碼的備註")
108     host_prompt=models.ManyToManyField("Host",blank=True,verbose_name="可關聯的主機",help_text="關聯主機與帳號密碼提示")
109     tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表
110     date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間')
111     class Meta:
112         verbose_name_plural='04帳號密碼'
113         unique_together = ('auth_type', 'username', 'password')  # 聯合惟一
114     def __str__(self):
115         return "%s:%s:%s" %(self.id,self.username,self.memo)
116 #05關聯主機與帳號密碼
117 class BindHost(models.Model):
118     host = models.ForeignKey('Host',on_delete=models.CASCADE,verbose_name="遠程主機名")
119     remote_user = models.ForeignKey('RemoteUser',on_delete=models.CASCADE,verbose_name="遠程用戶名")
120     memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="關聯的備註")
121     tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表
122     date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間')
123     class Meta:
124         verbose_name_plural = '05關聯主機與帳號密碼'
125         unique_together = ('host', 'remote_user')#聯合惟一
126     def __str__(self):
127         return "<%s:%s:%s>" %(self.host.id,self.host.hostname,self.remote_user.username)
128 #06主機分組
129 class HostGroups(models.Model):
130     name  = models.CharField(max_length=64,unique=True,verbose_name="分組名稱")
131     memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主機分組的備註")
132     bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="遠程主機")
133     tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表
134     date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間')
135     class Meta:
136         verbose_name_plural='06主機分組'
137     def __str__(self):
138         return self.name
139 #————————————————02堡壘機設計後臺交互程序 結束————————————————
140 #————————————————03堡壘機在Linux系統裏記錄會話日誌 開始————————————————
141 #07會話日誌
142 class Session(models.Model):
143     user = models.ForeignKey('UserProfile',on_delete=models.CASCADE,verbose_name='堡壘機帳號')
144     bind_host = models.ForeignKey('BindHost',on_delete=models.CASCADE,verbose_name='遠程主機')
145     uuid = models.CharField(max_length=128,default='n/a',verbose_name='惟一標識,進程ID')
146     cmd_count = models.IntegerField(default=0,verbose_name='命令執行數量')
147     stay_time = models.IntegerField(default=0,verbose_name="停留時長(秒)" ,help_text="每次刷新自動計算停留時間")
148     closed = models.BooleanField(default=False,verbose_name='是否關閉這條會話記錄')
149     memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="會話日誌的備註")
150     tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表
151     date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間')
152     def __str__(self):
153         return '<id:%s user:%s bind_host:%s>' % (self.id,self.user.email,self.bind_host.host)
154     class Meta:
155         verbose_name_plural = '07會話日誌'
156 #————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
157 
158 """
159 # ————————————————Django中使用中國時區和中文 開始————————————————
160 到settings.py裏修改#E:\堡壘機\eye\eye\settings.py
161 LANGUAGE_CODE = 'zh-Hans'
162 TIME_ZONE = 'Asia/Shanghai'
163 若是須要全局配置默認時區和語言,可在django下的conf模塊下的global_settings.py中進行配置
164 全部可選的語言選項可經過python輸入如下代碼查看:
165 from django.conf.locale import LANG_INFO
166 {key: LANG_INFO[key]['name_local'] for key in LANG_INFO if 'name_local' in LANG_INFO[key]}
167 # ————————時間擴展 開始———————— 
168 USE_TZ = True
169 當設置了 USE_TZ 爲 True 時,Django 與其餘系統或服務的交流將強制使用 UTC 時間。
170 1.保證存儲到數據庫中的是 UTC 時間;
171 2.在函數之間傳遞時間參數時,確保時間已經轉換成 UTC 時間;
172 # ——Django中跨時區 開始——
173 通常不跨時區的應用,能夠不使用時區,即在settings.py設置
174 USE_TZ = False
175 這樣存儲的時間就是無時區的時間。
176 # ——Django中跨時區 結束——
177 # ————————時間擴展 結束————————
178 # ————————————————Django中使用中國時區和中文 結束————————————————
179 """#Django中使用中國時區和中文
180 """
181 # ————————————————Django數據庫生成 開始————————————————
182 運行 Terminal
183 生成 數據表
184 E:\堡壘機\eye>python manage.py makemigrations
185 數據表 遷移
186 E:\堡壘機\eye>python manage.py migrate
187 # ————————————————Django數據庫生成 結束————————————————
188 """#Django數據庫生成
189 """
190 # ————————————————重寫Django帳號表後的建立方法 開始————————————————
191 E:\堡壘機\eye>python manage.py createsuperuser
192 郵箱地址: admin@qq.com
193 暱稱: admin
194 Password:           admin123456
195 Password (again):   admin123456    
196 Superuser created successfully.
197 # ————————————————重寫Django帳號表後的建立方法 結束————————————————
198 #啓動 DJANGO 服務
199 E:\堡壘機\eye>python manage.py runserver 127.0.0.1:8000
200 """#重寫Django帳號表後的建立方法
#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堡壘機設計後臺交互程序 結束————————————————
119 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始————————————————
120 #07會話日誌
121 class SessionAdmin(admin.ModelAdmin):
122     list_display = ['id','user','bind_host','cmd_count','stay_time','closed','memo','date']#顯示字段表頭
123     list_editable = ['closed','memo']  #可編輯
124     search_fields = ['user','bind_host','memo','tag'] #搜索
125     filter_horizontal = ['tag'] #複選框
126 admin.site.register(models.Session, SessionAdmin)
127 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
#admin.py

 

 

  1 #settings.py
  2 
  3 """
  4 Django settings for eye project.
  5 
  6 Generated by 'django-admin startproject' using Django 2.1.4.
  7 
  8 For more information on this file, see
  9 https://docs.djangoproject.com/en/2.1/topics/settings/
 10 
 11 For the full list of settings and their values, see
 12 https://docs.djangoproject.com/en/2.1/ref/settings/
 13 """
 14 
 15 import os
 16 
 17 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 18 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 19 
 20 
 21 # Quick-start development settings - unsuitable for production
 22 # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
 23 
 24 # SECURITY WARNING: keep the secret key used in production secret!
 25 SECRET_KEY = 'r35s$()7lli1hw-!6%llp0uu$!m!e#nnlxu+&!6$(g*6f0=@2#'
 26 
 27 # SECURITY WARNING: don't run with debug turned on in production!
 28 DEBUG = True
 29 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始————————————————
 30 # ALLOWED_HOSTS = []
 31 ALLOWED_HOSTS = ['*']
 32 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
 33 # Application definition
 34 
 35 INSTALLED_APPS = [
 36     'django.contrib.admin',
 37     'django.contrib.auth',
 38     'django.contrib.contenttypes',
 39     'django.contrib.sessions',
 40     'django.contrib.messages',
 41     'django.contrib.staticfiles',
 42     'Fortress.apps.FortressConfig',
 43 ]
 44 
 45 MIDDLEWARE = [
 46     'django.middleware.security.SecurityMiddleware',
 47     'django.contrib.sessions.middleware.SessionMiddleware',
 48     'django.middleware.common.CommonMiddleware',
 49     'django.middleware.csrf.CsrfViewMiddleware',
 50     'django.contrib.auth.middleware.AuthenticationMiddleware',
 51     'django.contrib.messages.middleware.MessageMiddleware',
 52     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 53 ]
 54 
 55 ROOT_URLCONF = 'eye.urls'
 56 
 57 TEMPLATES = [
 58     {
 59         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 60         'DIRS': [os.path.join(BASE_DIR, 'templates')]
 61         ,
 62         'APP_DIRS': True,
 63         'OPTIONS': {
 64             'context_processors': [
 65                 'django.template.context_processors.debug',
 66                 'django.template.context_processors.request',
 67                 'django.contrib.auth.context_processors.auth',
 68                 'django.contrib.messages.context_processors.messages',
 69             ],
 70         },
 71     },
 72 ]
 73 
 74 WSGI_APPLICATION = 'eye.wsgi.application'
 75 
 76 
 77 # Database
 78 # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
 79 
 80 DATABASES = {
 81     'default': {
 82         'ENGINE': 'django.db.backends.sqlite3',
 83         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 84     }
 85 }
 86 
 87 
 88 # Password validation
 89 # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
 90 
 91 AUTH_PASSWORD_VALIDATORS = [
 92     {
 93         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
 94     },
 95     {
 96         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
 97     },
 98     {
 99         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
100     },
101     {
102         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
103     },
104 ]
105 
106 
107 # Internationalization
108 # https://docs.djangoproject.com/en/2.1/topics/i18n/
109 #————————————————01堡壘機重寫DJANGO帳戶表 開始————————————————
110 # ————Django中使用中國時區和中文 開始————
111 #LANGUAGE_CODE = 'en-us'
112 #TIME_ZONE = 'UTC'
113 LANGUAGE_CODE = 'zh-Hans'
114 TIME_ZONE = 'Asia/Shanghai'
115 # ————Django中使用中國時區和中文 結束————
116 #————————————————01堡壘機重寫DJANGO帳戶表 結束————————————————
117 USE_I18N = True
118 
119 USE_L10N = True
120 #————————————————01堡壘機重寫DJANGO帳戶表 開始————————————————
121 # ————Django中跨時區 開始————
122 # USE_TZ = True
123 USE_TZ = False
124 # ————Django中跨時區 結束————
125 #————————————————01堡壘機重寫DJANGO帳戶表 結束————————————————
126 # Static files (CSS, JavaScript, Images)
127 # https://docs.djangoproject.com/en/2.1/howto/static-files/
128 
129 STATIC_URL = '/static/'
130 
131 #————————————————01堡壘機重寫DJANGO帳戶表 開始————————————————
132 AUTH_USER_MODEL = 'Fortress.UserProfile'
133 #————————————————01堡壘機重寫DJANGO帳戶表 結束————————————————
#settings.py

 


 

 

 1 """
 2 ————————建立跳板機的獨立用戶 開始————————
 3 [root@localhost ~]# useradd jump |#新建用戶(跳)      
 4 [root@localhost ~]# passwd jump  |#修改用戶(跳)的密碼
 5 新的 密碼:admineye
 6 從新輸入新的 密碼:admineye
 7 ————————建立跳板機的獨立用戶 結束————————
 8 ————————測試獨立用戶Django使用權限 開始————————
 9 [root@localhost ~] su jump
10 [jump@localhost root]$ python3
11 >>> import django
12 >>> print(django.get_version())
13 2.1.4
14 >>> exit()
15 [jump@localhost root]$ su root
16 密碼:123456
17 ————————測試獨立用戶Django使用權限 結束————————
18 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 開始——site-packages——————
19 [root@localhost ~]# python3
20 >>> import sys
21 >>> sys.path
22 >>> exit()
23 [root@localhost ~]# sudo cp -rp /usr/lib64/anacnda3/lib/python3.6/site-packages/* /home/jump/.local/lib/python3.6/site-packages/
24 [root@localhost ~]# cd /home/jump/.local/lib/python3.6/site-packages/
25 [root@localhost ~]# sudo chown -R jump.jump *
26 [root@localhost ~]# ll
27 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 結束——site-packages——————
28 """#獨立用戶
#獨立用戶

 

 

 

 

 1 """
 2 E:\堡壘機\eye 將項目複製到 CentOS-7 的 /home/jump/ 目錄下
 3 ———————複製Python代碼到服務用戶目錄下 開始—————————
 4 注意:修改settings中的設置,使其容許全部網段訪問: ALLOWED_HOSTS = ['*']
 5 [root@localhost ~]# cd /home/jump/eye
 6 [root@localhost eye]# ls
 7 [root@localhost eye]# python3 manage.py runserver 0.0.0.0:9000 |#運行服務時使用0.0.0.0:9000做爲IP和端口,執行命令
 8 [root@localhost ~]# systemctl stop firewalld.service |#注意:關閉防火牆 
 9 ———————複製Python代碼到服務用戶目錄下 結束—————————
10 
11 ———————測試項目交互腳本 開始—————————
12 [root@localhost ~]# python3 /home/jump/eye/fortess_manage.py
13 [root@localhost ~]# chmod -R 777 /home/jump |#修改權限,複製python項目文件到Luxin系統後注意從新賦值權限
14 ———————測試項目交互腳本 結束—————————
15 """#啓動服務
#啓動服務

 

 

 

 1 """
 2 ———————Windows系統測試 開始—————————
 3 瀏覽器訪問:http://192.192.168.143:9000/admin/
 4 ————putty測試 開始————
 5 login as: jump
 6 jump@192.192.168.143's password:admineye
 7 ----開始 運行交互腳本。。。----
 8 Username:admin@qq.com
 9 Password:admin123456
10 ----------------------歡迎 admin-----------------------
11 0.      測試組[1]
12 z.      未分組主機[1]
13 admin>>:
14 ————putty測試 結束————
15 ———————Windows系統測試 結束—————————
16 """#Windows系統測試
#Windows系統測試

 

 

 

 

 

 

 

 

 

 


 1 """
 2 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 開始——————————
 3 [root@localhost ~]# vim /etc/sudoers
 4 ———————進入vim文本編輯操做 開始—————————
 5 | i |#進入插入文本模式
 6 _______到底部插入 開始_______
 7 %jump  ALL=NOPASSWD:ALL #/use/bin/strace,/usr/bin/python3
 8 _______到底部插入 結束_______
 9 | Esc |#退出插入文本模式
10 | Shift + Q  |#進行EX操做模式
11 | wq! |#保存#退出vim文本編輯操做
12 ———————進入vim文本編輯操做 結束—————————
13 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 結束——————————
14 """#建立日誌
#建立日誌

 

 

 

 

 

 

 

 


 

 1 """
 2 ————————配置獨立用戶啓動項 開始————————
 3 [root@localhost ~]# cd /home/jump
 4 [root@localhost jump]# ls -a
 5 .  ..  .bash_logout  .bash_profile  .bashrc
 6 [root@localhost eye]# vim .bashrc
 7 ————若是vim打開錯誤 開始————
 8 [root@localhost conf]# rpm -qa|grep vim     |#若是vim打開錯誤
 9 [root@localhost conf]# yum -y install vim*  |#安裝vim
10 ————若是vim打開錯誤 結束————
11 ————進入vim文本編輯操做 開始————
12 | i |#進入插入文本模式
13 _____原有的內容 開始_____
14 if [ -f /etc/bashrc ]; then
15         . /etc/bashrc
16 fi
17 _____原有的內容 結束_____
18 _____插入的內容 開始_____
19 python3 /home/jump/eye/fortess_manage.py
20 logout
21 _____插入的內容 結束_____
22 | Esc |#退出插入文本模式
23 | Shift + Q  |#進行EX操做模式
24 | w |#保存vim文本編輯操做
25 | q |#退出vim
26 ————進入vim文本編輯操做 結束————
27 ————————配置獨立用戶啓動項 結束————————
28 """#啓動項
#啓動項

 

 

 

 

 

 

 

 

 

 

 

相關文章
相關標籤/搜索