您好,登錄后才能下訂單哦!
本篇文章為大家展示了利用python怎么對(duì)服務(wù)器的登錄情況進(jìn)行監(jiān)控,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
當(dāng)同一個(gè)遠(yuǎn)程服務(wù)器有多個(gè)人使用的時(shí)候,想知道服務(wù)器是否有人在用,我們不能直接的去登錄,因?yàn)檫@樣可能會(huì)把對(duì)方擠下來(lái),這并不友好,所以這里提供一個(gè)監(jiān)控遠(yuǎn)程服務(wù)器是否有人連接的方式
遇到這個(gè)問(wèn)題,想著如何去解決
剛開始的時(shí)候,我是想通過(guò)一個(gè)主動(dòng)的方式,去監(jiān)控到服務(wù)器是否有人連接,就是說(shuō)當(dāng)我想要知道服務(wù)器是否有人連接,我通過(guò)一個(gè)運(yùn)行一個(gè)腳本程序,然后返回給我一個(gè)結(jié)果,事實(shí)證明,我并沒有通過(guò)這樣的思路解決這個(gè)問(wèn)題
后來(lái)想以一個(gè)被動(dòng)的方式來(lái)監(jiān)控,比如在服務(wù)器上裝載一個(gè)腳本,每5分鐘運(yùn)行一次腳本,來(lái)確定服務(wù)器上是否有人連接,不過(guò)這也比較消耗資源,后來(lái)想到一個(gè)方式,就是監(jiān)控服務(wù)器連接和斷開的行為,在每次服務(wù)器連接和斷開的時(shí)候,運(yùn)行腳本來(lái)知道服務(wù)器是否有人連接
放個(gè)流程圖
這里是一整套的監(jiān)控流程圖,包括服務(wù)器監(jiān)控和界面展示
我們有了思路,接下來(lái)就是實(shí)現(xiàn)的問(wèn)題
實(shí)現(xiàn)起來(lái)也比較簡(jiǎn)單
但是我們需要解決幾個(gè)問(wèn)題
如何知道服務(wù)器有沒有人連接?
如何監(jiān)控遠(yuǎn)程服務(wù)器的連接和斷開?
對(duì)于第一個(gè)問(wèn)題,如何知道服務(wù)器有沒有人連接?
這里可以了解一下3389端口(遠(yuǎn)程桌面的服務(wù)端口)和netstat 命令,在windons服務(wù)器中,一般是一個(gè)遠(yuǎn)程連接的端口,就是說(shuō)你可以監(jiān)控這個(gè)端口,來(lái)知道服務(wù)器有沒有人遠(yuǎn)程連接;而netstat (顯示協(xié)議統(tǒng)計(jì)和當(dāng)前 TCP/IP 網(wǎng)絡(luò)連接)是一個(gè)cmd命令,我們可以通過(guò)它來(lái)監(jiān)控端口情況
比如這里我們要監(jiān)控3389端口
我們先連接遠(yuǎn)程連接服務(wù)器,打開cmd命令窗口,輸入命令:netstat -n -p tcp | find ":3389"
我們就得到一個(gè)類似如這樣的結(jié)果
TCP 10.11.174.373:55311 16.21.315.55:3389 ESTABLISHED
這里有2個(gè)ip,一個(gè)10.11.174.373,這個(gè)是你本地的ip,一個(gè)16.21.315.55,這個(gè)就是你服務(wù)器的ip
但你在服務(wù)器上運(yùn)行這個(gè)命令的時(shí)候,如果有遠(yuǎn)程連接,那么就會(huì)得到這樣的一個(gè)結(jié)果(當(dāng)然,你自己連接的也算),當(dāng)沒有人連接的時(shí)候,就會(huì)得到一個(gè)空的,沒有任何連接情況
這里的腳本,我們要實(shí)現(xiàn)3個(gè)功能:
獲取本地ip
獲取服務(wù)器連接狀態(tài)(ip)
相關(guān)數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)
雖然我們使用netstat命令監(jiān)控3389端口的時(shí)候有本地的ip,但是這只是有遠(yuǎn)程連接的時(shí)候有ip信息,但是如果無(wú)人連接,那么就獲取不到,當(dāng)然,你也可以自填本地ip,不過(guò)這樣并不是很好
獲取本地ip,這里我們是用python中的socket函數(shù)來(lái)實(shí)現(xiàn)
socket.getaddrinfo(socket.gethostname(),None)[-1][-1][0]
后面的服務(wù)器連接,上面有說(shuō)
數(shù)據(jù)庫(kù)存儲(chǔ),也就不多做說(shuō)明了,直接上下代碼(這里數(shù)據(jù)庫(kù),請(qǐng)自行建好)
#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @File : server_ip.py @Time : 2020/04/23 10:08:15 @Author : 吉祥鳥 @GitHub : https://github.com/jixn-hu @CSDN : https://me.csdn.net/qq_37462361 ''' import os import re import pyodbc import time import socket def now_time(): """ 格式化返回當(dāng)前時(shí)間 :return: """ now = int(time.time()) local_time = time.localtime(now) format_now = time.strftime("%Y-%m-%d %H:%M:%S", local_time) return format_now def open_184_db(db="rreporttask"): """ 開啟本地?cái)?shù)據(jù)庫(kù) :param db: 數(shù)據(jù)庫(kù)(默認(rèn)為rreporttask) :return: 創(chuàng)建好的數(shù)據(jù)庫(kù)連接 """ print(now_time(), '連接184數(shù)據(jù)庫(kù)%s' % db) driver = 'SQL Server' # 數(shù)據(jù)庫(kù)ip serverName = '******' # 登陸用戶名和密碼 userName = '******' passWord = '******' # 建立連接并獲取cursor conn = pyodbc.connect(driver=driver, server=serverName, user=userName, password=passWord, database=db, charset="gbk") return conn def insert_many(conn, items, table_name): """ 多條數(shù)據(jù)插入到數(shù)據(jù)庫(kù)(注:插入的數(shù)據(jù)包含表里的關(guān)鍵字) :param conn:數(shù)據(jù)庫(kù) :param items:插入的數(shù)據(jù)列表字典(列表內(nèi)包含字典類型) :param table_name:數(shù)據(jù)庫(kù)表名 :return:無(wú) """ print(now_time(), "更新數(shù)據(jù)表{}...".format(table_name)) # print(now_time(),"item:", items) if items: cursor = conn.cursor() sql1 = "insert into %s" % table_name sql2 = "(" sql3 = ") values(" sql4 = ")" for key in items[0].keys(): # 拼接sql語(yǔ)句 sql2 += "%s," % key sql3 += "?," # sql4 += "%s=values(%s)," % (key, key) sql = sql1 + sql2[:-1] + sql3[:-1] + sql4 item_values = [] for item in items: item_values.append(list(item.values())) num = len(item_values) # print(num) print(now_time(), '一共需要處理數(shù)據(jù)%s條' % num) # print(now_time(),"sql:", sql) try: for i in range(0, num, 1000): a = min(num, 1000 + i) # print(item_values[i:a]) cursor.executemany(sql, item_values[i:a]) conn.commit() print(now_time(), "當(dāng)前已經(jīng)處理%s條數(shù)據(jù)" % a) except Exception as e: print(now_time(), '更新數(shù)據(jù)失敗,回滾') print(e) conn.rollback() conn.close() def main(): items = [] item = {} time.sleep(1) cmd = 'netstat -n -p tcp | find ":3389"' command = os.popen(cmd) r = command.read() print(r) zz = r.split("\n")[0].split() if r=='': ip = "0000" else: local_ip = zz[1] local_ip = re.sub(r":.*$",'',local_ip) ip = zz[2] item["server_ip"]=socket.getaddrinfo(socket.gethostname(),None)[-1][-1][0] # 本地ip item["sign_ip"] = ip item["entrytime"] = now_time() items.append(item) print(item) conn = open_184_db() insert_many(conn,items,"server_sign") if __name__ == "__main__": main()
你可以把這個(gè)python腳本,打包成exe,然后放到服務(wù)器上,設(shè)置觸發(fā)條件,當(dāng)有人連接和斷開服務(wù)器的時(shí)候,運(yùn)行這個(gè)腳本
至于如何設(shè)置這個(gè)觸發(fā)器,這就是第二個(gè)問(wèn)題了,如何監(jiān)控遠(yuǎn)程服務(wù)器的連接和斷開?
這里可以百度下,windons自帶的任務(wù)計(jì)劃程序,通過(guò)這個(gè)我們可以設(shè)置exe服務(wù)器連接和斷開的時(shí),運(yùn)行exe腳本,放個(gè)圖,之后的自行摸索下
其實(shí)到這里,基本就是結(jié)束了,詳細(xì)的思路和主要的實(shí)現(xiàn),也都有了,我們可以直接查詢數(shù)據(jù)庫(kù)就能的知道服務(wù)器連接的情況
不過(guò)后面為了更方便看,后面我自己又使用flask做了一個(gè)界面展示
就不多說(shuō)明了
先放個(gè)成果圖
直接上代碼
server_sign.py:
#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @File : server_sign.py @Time : 2020/04/07 10:47:52 @Author : 吉祥鳥 @GitHub : https://github.com/jixn-hu @CSDN : https://me.csdn.net/qq_37462361 ''' import re import pyodbc import time from flask import Flask,render_template app=Flask(__name__) def now_time(): """ 格式化返回當(dāng)前時(shí)間 :return: """ now = int(time.time()) local_time = time.localtime(now) format_now = time.strftime("%Y-%m-%d %H:%M:%S", local_time) return format_now def open_184_db(db="rreporttask"): """ 開啟本地?cái)?shù)據(jù)庫(kù) :param db: 數(shù)據(jù)庫(kù)(默認(rèn)為rreporttask) :return: 創(chuàng)建好的數(shù)據(jù)庫(kù)連接 """ print(now_time(), '連接184數(shù)據(jù)庫(kù)%s' % db) driver = 'SQL Server' serverName = '******' # 登陸用戶名和密碼 userName = '******' passWord = '******' # 建立連接并獲取cursor conn = pyodbc.connect(driver=driver, server=serverName, user=userName, password=passWord, database=db, charset="gbk") return conn def select_one(conn, sql="select ios_id from ios_main"): """ 查詢信息 :param time: :param type: :return: """ print(now_time(), "正在查詢數(shù)據(jù)庫(kù)......") cursor = conn.cursor() try: cursor.execute(sql) result = cursor.fetchall() conn.commit() print(now_time(), "數(shù)據(jù)查詢成功") return result except: print(now_time(), '更新數(shù)據(jù)失敗,回滾') conn.rollback() conn.close() @app.route('/admin/<name>') # route() 裝飾器告訴 Flask 什么樣的URL 能觸發(fā)我們的函數(shù) def hello_world(name): conn = open_184_db() data_back = {} datas = select_one(conn,"select server_ip,sign_ip,entrytime from(select *,ROW_NUMBER()over(partition by server_ip order by entrytime desc)rank from rreporttask..server_sign) as z where rank=1 order by server_ip") for data in datas: if data[1]=='0000' or '3389' in data[1]: data_back[data[0]]="未連接" data[1]="無(wú)" else: data_back[data[0]]="連接ing" # print(datas) return render_template("login.html",name=name,datas=datas,data_back=data_back) @app.route('/hal/<name>') # route() 裝飾器告訴 Flask 什么樣的URL 能觸發(fā)我們的函數(shù) def hello_world1(name): return "hellodd {}".format(name) if __name__ == "__main__": app.run(debug = True,host='0.0.0.0') # 用 run() 函數(shù)來(lái)讓應(yīng)用運(yùn)行在本地服務(wù)器上
login.html:
<html> <!-- CSS goes in the document HEAD or added to your external stylesheet --> <style type="text/css"> table.hovertable { font-family: verdana,arial,sans-serif; font-size:11px; color:#333333; border-width: 1px; border-color: #999999; border-collapse: collapse; } table.hovertable th { background-color:#c3dde0; border-width: 1px; padding: 8px; border-style: solid; border-color: #a9c6c9; } table.hovertable tr { background-color:#d4e3e5; } table.hovertable td { border-width: 1px; padding: 8px; border-style: solid; border-color: #a9c6c9; } </style> <body> <h2>服務(wù)器登錄狀態(tài)查看</h2> <table class="hovertable"> <tr> <th>服務(wù)器ip</th> <th>登錄ip</th> <th>連接時(shí)間</th> <th>連接狀態(tài)</th> </tr> {% for data in datas %} <tr> <td>{{ data[0] }}</td> <td>{{ data[1] }}</td> <td>{{ data[2] }}</td> <td>{{ data_back[data[0]] }}</td> </tr> {% endfor %} </table> </body> </html>
最后,放一個(gè)思維導(dǎo)圖,供參考
上述內(nèi)容就是利用python怎么對(duì)服務(wù)器的登錄情況進(jìn)行監(jiān)控,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。