<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] Linux下收集數據就有很多命令和工具了,比Windows方便多了。 <br /> 但是要在Python的進程中運行操作系統級別的命令,通常需要使用subprocess模塊。這個模塊的具體用法,請查看Python教程中相關部分的內容。 <br /> 在Client/plugins下創建一個`collect_linux_info.py`文件,寫入下面的代碼: <details> <summary>collect_linux_info.py</summary> ``` # -*- coding:utf-8 -*- import subprocess def collect(): filter_keys = ['Manufacturer', 'Serial Number', 'Product Name', 'UUID', 'Wake-up Type'] raw_data = {} for key in filter_keys: try: res = subprocess.Popen("sudo dmidecode -t system|grep '%s'" % key, stdout=subprocess.PIPE, shell=True) result = res.stdout.read().decode() data_list = result.split(':') if len(data_list) > 1: raw_data[key] = data_list[1].strip() else: raw_data[key] = '' except Exception as e: print(e) raw_data[key] = '' data = dict() data['asset_type'] = 'server' data['manufacturer'] = raw_data['Manufacturer'] data['sn'] = raw_data['Serial Number'] data['model'] = raw_data['Product Name'] data['uuid'] = raw_data['UUID'] data['wake_up_type'] = raw_data['Wake-up Type'] data.update(get_os_info()) data.update(get_cpu_info()) data.update(get_ram_info()) data.update(get_nic_info()) data.update(get_disk_info()) return data def get_os_info(): """ 獲取操作系統信息 :return: """ distributor = subprocess.Popen("lsb_release -a|grep 'Distributor ID'", stdout=subprocess.PIPE, shell=True) distributor = distributor.stdout.read().decode().split(":") release = subprocess.Popen("lsb_release -a|grep 'Description'", stdout=subprocess.PIPE, shell=True) release = release.stdout.read().decode().split(":") data_dic = { "os_distribution": distributor[1].strip() if len(distributor) > 1 else "", "os_release": release[1].strip() if len(release) > 1 else "", "os_type": "Linux", } return data_dic def get_cpu_info(): """ 獲取cpu信息 :return: """ raw_cmd = 'cat /proc/cpuinfo' raw_data = { 'cpu_model': "%s |grep 'model name' |head -1 " % raw_cmd, 'cpu_count': "%s |grep 'processor'|wc -l " % raw_cmd, 'cpu_core_count': "%s |grep 'cpu cores' |awk -F: '{SUM +=$2} END {print SUM}'" % raw_cmd, } for key, cmd in raw_data.items(): try: result = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) raw_data[key] = result.stdout.read().decode().strip() except ValueError as e: print(e) raw_data[key] = "" data = { "cpu_count": raw_data["cpu_count"], "cpu_core_count": raw_data["cpu_core_count"] } cpu_model = raw_data["cpu_model"].split(":") if len(cpu_model) > 1: data["cpu_model"] = cpu_model[1].strip() else: data["cpu_model"] = '' return data def get_ram_info(): """ 獲取內存信息 :return: """ raw_data = subprocess.Popen("sudo dmidecode -t memory", stdout=subprocess.PIPE, shell=True) raw_list = raw_data.stdout.read().decode().split("\n") raw_ram_list = [] item_list = [] for line in raw_list: if line.startswith("Memory Device"): raw_ram_list.append(item_list) item_list = [] else: item_list.append(line.strip()) ram_list = [] for item in raw_ram_list: item_ram_size = 0 ram_item_to_dic = {} for i in item: data = i.split(":") if len(data) == 2: key, v = data if key == 'Size': if v.strip() != "No Module Installed": ram_item_to_dic['capacity'] = v.split()[0].strip() item_ram_size = round(v.split()[0]) else: ram_item_to_dic['capacity'] = 0 if key == 'Type': ram_item_to_dic['model'] = v.strip() if key == 'Manufacturer': ram_item_to_dic['manufacturer'] = v.strip() if key == 'Serial Number': ram_item_to_dic['sn'] = v.strip() if key == 'Asset Tag': ram_item_to_dic['asset_tag'] = v.strip() if key == 'Locator': ram_item_to_dic['slot'] = v.strip() if item_ram_size == 0: pass else: ram_list.append(ram_item_to_dic) raw_total_size = subprocess.Popen("cat /proc/meminfo|grep MemTotal ", stdout=subprocess.PIPE, shell=True) raw_total_size = raw_total_size.stdout.read().decode().split(":") ram_data = {'ram': ram_list} if len(raw_total_size) == 2: total_gb_size = int(raw_total_size[1].split()[0]) / 1024**2 ram_data['ram_size'] = total_gb_size return ram_data def get_nic_info(): """ 獲取網卡信息 :return: """ raw_data = subprocess.Popen("ifconfig -a", stdout=subprocess.PIPE, shell=True) raw_data = raw_data.stdout.read().decode().split("\n") nic_dic = dict() next_ip_line = False last_mac_addr = None for line in raw_data: if next_ip_line: next_ip_line = False nic_name = last_mac_addr.split()[0] mac_addr = last_mac_addr.split("HWaddr")[1].strip() raw_ip_addr = line.split("inet addr:") raw_bcast = line.split("Bcast:") raw_netmask = line.split("Mask:") if len(raw_ip_addr) > 1: ip_addr = raw_ip_addr[1].split()[0] network = raw_bcast[1].split()[0] netmask = raw_netmask[1].split()[0] else: ip_addr = None network = None netmask = None if mac_addr not in nic_dic: nic_dic[mac_addr] = {'name': nic_name, 'mac': mac_addr, 'net_mask': netmask, 'network': network, 'bonding': 0, 'model': 'unknown', 'ip_address': ip_addr, } else: if '%s_bonding_addr' % (mac_addr,) not in nic_dic: random_mac_addr = '%s_bonding_addr' % (mac_addr,) else: random_mac_addr = '%s_bonding_addr2' % (mac_addr,) nic_dic[random_mac_addr] = {'name': nic_name, 'mac': random_mac_addr, 'net_mask': netmask, 'network': network, 'bonding': 1, 'model': 'unknown', 'ip_address': ip_addr, } if "HWaddr" in line: next_ip_line = True last_mac_addr = line nic_list = [] for k, v in nic_dic.items(): nic_list.append(v) return {'nic': nic_list} def get_disk_info(): """ 獲取存儲信息。 本腳本只針對ubuntu中使用sda,且只有一塊硬盤的情況。 具體查看硬盤信息的命令,請根據實際情況,實際調整。 如果需要查看Raid信息,可以嘗試MegaCli工具。 :return: """ raw_data = subprocess.Popen("sudo hdparm -i /dev/sda | grep Model", stdout=subprocess.PIPE, shell=True) raw_data = raw_data.stdout.read().decode() data_list = raw_data.split(",") model = data_list[0].split("=")[1] sn = data_list[2].split("=")[1].strip() size_data = subprocess.Popen("sudo fdisk -l /dev/sda | grep Disk|head -1", stdout=subprocess.PIPE, shell=True) size_data = size_data.stdout.read().decode() size = size_data.split(":")[1].strip().split(" ")[0] result = {'physical_disk_driver': []} disk_dict = dict() disk_dict["model"] = model disk_dict["size"] = size disk_dict["sn"] = sn result['physical_disk_driver'].append(disk_dict) return result if __name__ == "__main__": # 收集信息功能測試 data = collect() print(data) ``` </details> <br /> 代碼整體沒有什么難點,無非就是使用subprocess.Popen()方法執行Linux的命令,然后獲取返回值,并以規定的格式打包到data字典里。 需要說明的問題有: * 當Linux中存在好幾個Python解釋器版本時,要注意調用方式,前面已經強調過了; * 不同的Linux發行版,有些命令可能沒有,需要額外安裝; * 所使用的查看硬件信息的命令并不一定必須和這里的一樣,只要能獲得數據就行; * 有一些命令在ubuntu中涉及sudo的問題,需要特別對待; * 最終數據字典的格式一定要正確; * 可以在Linux下配置cronb或其它定時服務,設置定期的數據收集、報告任務。 * * * 下面在Linux虛擬機上,測試一下客戶端。 將Pycharm中的Client客戶端文件夾,拷貝到Linux虛擬機中,這里是ubuntu16.04. 進入bin目錄,運行“python3 main.py report\_data”,一切順利的話應該能得到如下的反饋: ~~~ 正在將數據發送至: [http://192.168.1.100:8000/assets/report/] ...... 發送完畢! 返回結果:成功收到數據! 日志記錄成功! ~~~ 然后,在Pycharm中,也可以看到接收的數據: ~~~ { "asset_type": "server", "manufacturer": "innotek GmbH", "sn": "0", "model": "VirtualBox", "uuid": "E8DE611C-4279-495C-9B58-502B6FCED076", "wake_up_type": "Power Switch", "os_distribution": "Ubuntu", "os_release": "Ubuntu 16.04.3 LTS", "os_type": "Linux", "cpu_count": "2", "cpu_core_count": "4", "cpu_model": "Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz", "ram": [], "ram_size": 3.858997344970703, "nic": [], "physical_disk_driver": [ { "model": "VBOX HARDDISK", "size": "50", "sn": "VBeee1ba73-09085302" } ] } ~~~ 可以看到,由于是virtualbox虛擬機的原因,sn為0,內存和網卡信息一條都沒有,數據有點可憐,vmware的虛擬機可能好點。如果你對Linux比較熟悉,還可以自己嘗試獲取更多的數據,但是要注意虛擬機的sn可能重復,要防止沖突。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看