python監視サーバにリモートログインがあるかどうか(詳細なアイデア+コード)


起源
同じリモートサーバーで複数の人が使用している場合、サーバーが誰か使っているかを知りたいです。直接登録することはできません。これは相手を押しのけてしまうかもしれません。友好的ではないので、リモートサーバーの接続方法を監視します。
考え方
この問題をどう解決したいですか?
最初はアクティブな方法でサーバーに接続されているかどうかを監視したいです。つまり、サーバーに接続されているかどうかを知りたいです。スクリプトプログラムを実行して、結果を返したいです。私はこのような考え方でこの問題を解決していません。
その後、サーバーにスクリプトを搭載し、5分ごとにスクリプトを実行して、サーバーに接続されている人がいるかどうかを確認する受動的な方法で監視したいですが、これも資源を消費しています。サーバーの接続と切断を監視する方法です。スクリプトを実行して、サーバーが接続されているかどうかを確認します。
フローチャートを置く

ここは一連の監視フロー図で、サーバーの監視とインタフェースの展示を含みます。
実現する
私たちは考えができました。次は実現の問題です。
実現するのも簡単です。
しかし、いくつかの問題を解決しなければなりません。
  • はどうやってサーバーに人が接続されていますか?
  • は、リモートサーバの接続と切断をどのように監視しますか?
  • cmdコマンドnetstatモニタ3389ポート
    最初の問題について、どうやってサーバーに接続者がいるかどうかを知りますか?
    ここでは、3389ポートリモートデスクトップのサービスポート)とnetstatコマンドは、ウィンドウズサーバでは、一般的にリモート接続のポートです。つまり、このポートを監視して、サーバーがリモート接続されているかどうかを知ることができます。netstat(プロトコル統計と現在のTCP/IPネットワーク接続を表示します)はcmdコマンドです。ポートの状況を監視します。
    たとえば、ここで3389ポートを監視します。
    まずリモート接続サーバーに接続して、cmdコマンドウィンドウを開けて、コマンドを入力します。netstat-n-p tcp find「:3389」
    私たちはこのような結果を得ました。
    TCP 10.11.174.373:55313116.315.5:3389 ESTABLISHED
    ここには2つのipがあります。1つは10.11.174.373です。これは地元のipです。一つは16.21.315.55です。これはあなたのサーバーのipです。
    しかし、このコマンドをサーバーで実行すると、リモート接続があれば、このような結果が得られます(もちろん、自分で接続したものも計算します)。誰も接続していない場合、空いています。接続状況はありません。
    pythonスクリプトの実現
    ここのスクリプトは、3つの機能を実現します。
  • ローカルip
  • を取得する。
  • は、サーバ接続状態(ip)
  • を取得する。
  • 関連データはデータベース
  • に格納される。
    netstatコマンドを使って、3389ポートを監視する時、ローカルのipがありますが、これはリモート接続の時にip情報があるだけです。しかし、誰も接続していないと入手できません。もちろん、ローカルのipを自分で作成することもできますが、これはあまり良くないです。
    ローカルipを取得します。ここではpythonのsocket関数で実現します。
    
    socket.getaddrinfo(socket.gethostname(),None)[-1][-1][0]
    後のサーバーは接続して、上は言います。
    データベースの記憶は、多く説明しなくてもいいです。直接にコードを上下します。
    
    #!/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():
      """
               
      :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"):
      """
             
      :param db:    (   rreporttask)
      :return:          
      """
      print(now_time(), '  184   %s' % db)
      driver = 'SQL Server'
      #    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):
      """
                ( :             )
      :param conn:   
      :param items:         (         )
      :param table_name:     
      :return: 
      """
      print(now_time(), "     {}...".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  
          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(), '        %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(), "      %s   " % a)
        except Exception as e:
          print(now_time(), '      ,  ')
          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("
    ")[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()
    このpythonスクリプトをexeに包んでサーバーにセットしてトリガ条件を設定してください。誰かが接続してサーバーを切断した時にこのスクリプトを実行します。
    どのようにこのトリガーを設置しますか?これは第二の問題です。リモートサーバの接続と切断をどう監視しますか?
    ここで百度の下で、windownsが持っているミッションプログラムは、これを通じてexeサーバの接続と切断を設定することができます。exeスクリプトを実行して、図を放して、その後の自分で模索します。

    実はここに来て、基本的に終わりました。詳しい構想と主要な実現もあります。データベースを直接調べて、サーバー接続の状況を知ることができます。
    ディスプレイ
    後はもっと見やすいように、後は自分でflashkを使ってインタフェース展示をしました。
    これ以上説明しません
    まずアウトプット図を置きます

    直接コード
    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():
      """
               
      :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"):
      """
             
      :param db:    (   rreporttask)
      :return:          
      """
      print(now_time(), '  184   %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(), "       ......")
      cursor = conn.cursor()
      try:
        cursor.execute(sql)
        result = cursor.fetchall()
        conn.commit()
        print(now_time(), "      ")
        return result
      except:
        print(now_time(), '      ,  ')
        conn.rollback()
      conn.close()
    
    
    
    @app.route('/admin/<name>') # route()       Flask     URL         
    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]=" "
        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         
    def hello_world1(name):
      return "hellodd {}".format(name)
    
    if __name__ == "__main__":
      app.run(debug = True,host='0.0.0.0') #   run()                
    login.
    
    <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>
       <h1>         </h1>
       <table class="hovertable">
         <tr>
          <th>   ip</th>
          <th>  ip</th>
          <th>    </th>
          <th>    </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>
    コンダクタンス
    最後に、参考にするために、思考図を置きます。

    以上がpython監視サーバーの誰かが遠隔登録(詳細なアイデア+コード)しているかどうかの詳細です。python監視サーバーに関する詳細は他の関連記事に注目してください。