Extracción de información de hardware y sistema Linux con Python
FEncontrar información de hardware y sistema en Linux es una tarea útil e interesante. Podemos extraer detalles del sistema operativo, detalles del usuario, detalles de la memoria, detalles de la CPU y mucho más usando códigos simples de Python en Linux. Aunque podemos realizar muchas de esas cosas usando scripts de terminal y bash, Python es mucho más interesante.
Como amantes de Python, queremos que todas las tareas se realicen utilizando ese lenguaje, por lo que extraer información del sistema y del hardware con Python es una gran tarea. Además, podemos aprender tanto Linux como Python al mismo tiempo. Este artículo será bastante largo, así que tómate tu tiempo para leer el artículo completo y ejecutar cada código para una mejor comprensión.
Puede copiar cada uno de los códigos en un IDE de Python y ejecutarlo. Si no tiene un IDE de Python o desea comparar entre IDE, consulte nuestra guía sobre los 10 IDE principales para Linux. Por cierto, estoy usando VS Code como un IDE para escribir código. Es de código abierto y fácil de usar. Si desea utilizar Visual Studio Code, consulte nuestra guía sobre la instalación de código VS en Linux.
Extrayendo información del sistema usando Python
En este artículo, desarrollaremos un programa que extraerá los siguientes detalles:
- Detalles básicos del sistema
- Detalles de la CPU
- Información de la memoria
- Uso del disco
- Información de la red
- Otros detalles de hardware
Para obtener estos detalles, usaremos los módulos presentes en la biblioteca estándar de Python. Algunos de los módulos que usaremos son SO, plataforma, etc. También puse el código fuente en Github; puede ver una demostración del programa descargándolo de mi repositorio de Github y ejecutándolo.
Para seguir este tutorial, se recomienda tener instalada la última versión de Python en su sistema. Puede seguir nuestra guía sobre la instalación de Python en Linux.
Requisitos
Muchas de las bibliotecas que usamos en este tutorial están presentes en la biblioteca estándar de Python. Solo necesitamos instalar el paquete psutil. Puede comprobarlo importándolo. Si no tiene psutil instalado, puede instalarlo fácilmente con la herramienta pip. Para instalar pip en nuestro sistema, necesitamos ejecutar el siguiente comando en la terminal.
pip install psutil
Obtener detalles básicos del sistema
Ahora que ha instalado psutil, veamos cómo usarlo para recopilar el sistema operativo usando Python. Estábamos usando el plataforma módulo presente en la biblioteca estándar de Python para recopilar esta información básica del sistema. Debe copiar el siguiente código en su IDE de Python favorito y ejecutarlo.
# importing the required modules import platform # printing the Architecture of the OS print("[+] Architecture :", platform.architecture()[0]) # Displaying the machine print("[+] Machine :", platform.machine()) # printing the Operating System release information print("[+] Operating System Release :", platform.release()) # prints the currently using system name print("[+] System Name :",platform.system()) # This line will print the version of your Operating System print("[+] Operating System Version :", platform.version()) # This will print the Node or hostname of your Operating System print("[+] Node: " + platform.node()) # This will print your system platform print("[+] Platform :", platform.platform()) # This will print the processor information print("[+] Processor :",platform.processor())
En el código anterior, primero importamos el módulo de plataforma presente en la biblioteca estándar de Python. Después de importar el módulo, usamos las funciones del módulo de la plataforma para obtener la información requerida. Al ejecutar el código en mi dispositivo, obtuve el siguiente resultado.
Como podemos ver en el resultado, el programa muestra muchos detalles importantes sobre el sistema operativo, como la arquitectura del sistema, la plataforma y mucho más.
Tiempo de actividad del sistema
También podemos obtener el tiempo de arranque del sistema y el tiempo de actividad del sistema en Python. Necesitamos usar el psutil biblioteca que hemos instalado anteriormente. Podemos obtener el tiempo de actividad del sistema leyendo el archivo de tiempo de actividad presente en el directorio proc en Linux.
Copie el siguiente código en su IDE de Python favorito y ejecútelo.
from datetime import datetime import psutil # Using the psutil library to get the boot time of the system boot_time = datetime.fromtimestamp(psutil.boot_time()) print("[+] System Boot Time :", boot_time)
Este código imprimirá la hora de inicio, es decir, la hora en que se inició el sistema. Al ejecutar el programa en mi PC, obtuve el siguiente resultado.
También podemos ver el tiempo de actividad del sistema, que es el tiempo durante el cual el sistema está funcionando. Necesitamos leer el archivo de tiempo de actividad del directorio proc, como se muestra en el siguiente código.
# getting thesystem up time from the uptime file at proc directory with open("/proc/uptime", "r") as f: uptime = f.read().split(" ")[0].strip() uptime = int(float(uptime)) uptime_hours = uptime // 3600 uptime_minutes = (uptime % 3600) // 60 print("[+] System Uptime : " + str(uptime_hours) + ":" + str(uptime_minutes) + " hours")
Tengo el siguiente resultado al ejecutar el código.
Procesos
También podemos usar Python para obtener una lista de los procesos que se están ejecutando actualmente, el número total de procesos. Necesitamos ejecutar el siguiente código.
import os pids = [] for subdir in os.listdir('/proc'): if subdir.isdigit(): pids.append(subdir) print('Total number of processes : {0}'.format(len(pids)))
Al ejecutar el código, obtuve el resultado, como se muestra en la imagen de abajo.
informacion del usuario
También podemos obtener la lista de todos los usuarios presentes en nuestro dispositivo Linux utilizando la biblioteca pwd presente en la biblioteca estándar de Python. Para hacer esto, necesita copiar el siguiente código en su Python IDE y ejecutarlo.
import pwd users = pwd.getpwall() for user in users: print(user.pw_name, user.pw_shell)
Al ejecutar el código anterior, obtendrá todos los usuarios presentes en su dispositivo y sus shells.
Información de la CPU
Hemos recopilado los Detalles del sistema ahora para recopilar cierta información sobre la CPU utilizada por nuestra máquina. Podemos recopilar información de la CPU de nuestra máquina Linux de dos maneras. La primera y más sencilla forma es utilizar el psutil módulo y la segunda forma es leyendo el archivo / proc / cpuinfo.
Veamos cómo podemos usar la biblioteca psutil para obtener la información de la CPU. Debe copiar el siguiente código en su IDE de Python favorito y ejecutarlo.
# importing the required packages import psutil # This code will print the number of CPU cores present print("[+] Number of Physical cores :", psutil.cpu_count(logical=False)) print("[+] Number of Total cores :", psutil.cpu_count(logical=True)) print("n") # This will print the maximum, minimum and current CPU frequency cpu_frequency = psutil.cpu_freq() print(f"[+] Max Frequency : {cpu_frequency.max:.2f}Mhz") print(f"[+] Min Frequency : {cpu_frequency.min:.2f}Mhz") print(f"[+] Current Frequency : {cpu_frequency.current:.2f}Mhz") print("n") # This will print the usage of CPU per core for i, percentage in enumerate(psutil.cpu_percent(percpu=True, interval=1)): print(f"[+] CPU Usage of Core {i} : {percentage}%") print(f"[+] Total CPU Usage : {psutil.cpu_percent()}%")
Veamos qué está sucediendo en el programa anterior. En la primera línea, importamos el psutil módulo, que ayudará a recopilar los detalles de la CPU. En la segunda y tercera líneas, usamos el cpu_count () función de la psutil módulo para contar el número de núcleos de CPU. Luego usamos la función cpu_freq () para obtener la frecuencia máxima, mínima y actual. Por último, usamos la función cpu_percent fo psutil para encontrar el uso de la CPU. Al ejecutar el código en mi máquina, obtuve el siguiente resultado.
Como podemos ver en la salida, todos los detalles de la CPU han sido emitidos por el programa en el terminal. También podemos obtener el nombre de la CPU leyendo el archivo / proc / cpuinfo usando python. Para hacer esto, necesitamos ejecutar el siguiente código.
# reading the cpuinfo file to print the name of # the CPU present with open("/proc/cpuinfo", "r") as f: file_info = f.readlines() cpuinfo = [x.strip().split(":")[1] for x in file_info if "model name" in x] for index, item in enumerate(cpuinfo): print("[+] Processor " + str(index) + " : " + item)
También podemos recopilar otra información de la CPU utilizando el archivo / proc / cpuinfo. Solo leo el nombre del modelo de CPU, pero puede abrir el archivo y ver la otra información presente en el archivo y puede usarlos en el programa. Aquí está la salida.
Recopilemos algo de información sobre la memoria usando Python.
Información de la memoria
Al igual que la información de la CPU, también podemos obtener información de la memoria de dos lugares. Uno está usando la herramienta psutil y el segundo es leyendo el archivo proc / meminfo. Para empezar, comencemos a recopilar información de la memoria usando la biblioteca psutil. Copie el siguiente código en su IDE de Python favorito y ejecútelo.
# importing the requred modules import psutil # writing a function to convert bytes to GigaByte def bytes_to_GB(bytes): gb = bytes/(1024*1024*1024) gb = round(gb, 2) return gb # Using the virtual_memory() function it will return a tuple virtual_memory = psutil.virtual_memory() #This will print the primary memory details print("[+] Total Memory present :", bytes_to_GB(virtual_memory.total), "Gb") print("[+] Total Memory Available :", bytes_to_GB(virtual_memory.available), "Gb") print("[+] Total Memory Used :", bytes_to_GB(virtual_memory.used), "Gb") print("[+] Percentage Used :", virtual_memory.percent, "%") print("n") # This will print the swap memory details if available swap = psutil.swap_memory() print(f"[+] Total swap memory :{bytes_to_GB(swap.total)}") print(f"[+] Free swap memory : {bytes_to_GB(swap.free)}") print(f"[+] Used swap memory : {bytes_to_GB(swap.used)}") print(f"[+] Percentage Used: {swap.percent}%")
Veamos qué está pasando en el código anterior. En la primera línea, importamos la biblioteca psutil, luego usamos su función virtual_memory (), que devuelve una tupla con información de memoria virtual. Luego usamos la función swap_memory () para obtener la información de la memoria de intercambio. También construimos un nombre de función bytes_to_GB (), que convertirá los bytes en GigaBytes para una mejor legibilidad. Obtuve el siguiente resultado.
También podemos usar el archivo meminfo presente en el directorio proc de Linux para recuperar información de la memoria como la memoria total, la memoria utilizada, etc. Para hacer esto, ejecute el siguiente código.
# Gathering memory information from meminfo file print("nReading the /proc/meminfo file: n") with open("/proc/meminfo", "r") as f: lines = f.readlines() print("[+] " + lines[0].strip()) print("[+] " + lines[1].strip())
Y aquí está la salida:
Información del disco
Hasta ahora, hemos visto algunos detalles básicos del sistema, detalles de la CPU, detalles de la memoria. Ahora veamos la información sobre el disco presente en nuestra máquina. Para extraer información del disco, usaremos el módulo psutil para facilitar nuestra tarea, y no necesitamos reinventar la rueda. Mire el código a continuación para ver un ejemplo funcional del código. Puede copiar el código y ejecutarlo en el IDE de su python favorito.
# importing required modules import psutil # accessing all the disk partitions disk_partitions = psutil.disk_partitions() # writing a function to convert bytes to Giga bytes def bytes_to_GB(bytes): gb = bytes/(1024*1024*1024) gb = round(gb, 2) return gb # displaying the partition and usage information for partition in disk_partitions: print("[+] Partition Device : ", partition.device) print("[+] File System : ", partition.fstype) print("[+] Mountpoint : ", partition.mountpoint) disk_usage = psutil.disk_usage(partition.mountpoint) print("[+] Total Disk Space :", bytes_to_GB(disk_usage.total), "GB") print("[+] Free Disk Space :", bytes_to_GB(disk_usage.free), "GB") print("[+] Used Disk Space :", bytes_to_GB(disk_usage.used), "GB") print("[+] Percentage Used :", disk_usage.percent, "%") # get read/write statistics since boot disk_rw = psutil.disk_io_counters() print(f"[+] Total Read since boot : {bytes_to_GB(disk_rw.read_bytes)} GB") print(f"[+] Total Write sice boot : {bytes_to_GB(disk_rw.write_bytes)} GB")
En el código, primero hemos importado la biblioteca psutil, que es necesaria para recopilar la información del disco. Entonces usamos su disk_partitions () función para obtener la lista de particiones de disco disponibles con su información. También usamos la función disk_usage () para obtener el uso de estas particiones. Finalmente, usamos el disk_io_counters () función para obtener el total de lectura / escritura del disco desde el arranque. A continuación se muestra un resultado de ejemplo.
Puede obtener algún otro resultado dependiendo de su disco y particiones.
Información de la red
También podemos recopilar la información de red del sistema utilizando la biblioteca psutil. Para hacerlo, copie el siguiente código en su Python IDE y ejecútelo.
# importing the required modules import psutil # writing a function to convert the bytes into gigabytes def bytes_to_GB(bytes): gb = bytes/(1024*1024*1024) gb = round(gb, 2) return gb # gathering all network interfaces (virtual and physical) from the system if_addrs = psutil.net_if_addrs() # printing the information of each network interfaces for interface_name, interface_addresses in if_addrs.items(): for address in interface_addresses: print("n") print(f"Interface :", interface_name) if str(address.family) == 'AddressFamily.AF_INET': print("[+] IP Address :", address.address) print("[+] Netmask :", address.netmask) print("[+] Broadcast IP :", address.broadcast) elif str(address.family) == 'AddressFamily.AF_PACKET': print("[+] MAC Address :", address.address) print("[+] Netmask :", address.netmask) print("[+] Broadcast MAC :",address.broadcast) # getting the read/write statistics of network since boot print("n") net_io = psutil.net_io_counters() print("[+] Total Bytes Sent :", bytes_to_GB(net_io.bytes_sent)) print("[+] Total Bytes Received :", bytes_to_GB(net_io.bytes_recv))
Aquí hay un resultado de ejemplo de mi PC de prueba.
Otra información de hardware
También podemos utilizar el psutil biblioteca para obtener otra información de hardware como información de la batería, velocidad de rotación de los ventiladores, información de temperatura de varios dispositivos, etc. Veamos cómo podemos hacer esto uno por uno.
Si está usando una computadora portátil, puede usar el psutil.sensors_battery () función para obtener la información de la batería. Para hacerlo, copie y ejecute el siguiente código en su IDE de Python.
import psutil battery = psutil.sensors_battery() print("[+] Battery Percentage :", round(battery.percent, 1), "%") print("[+] Battery time left :", round(battery.secsleft/3600, 2), "hr") print("[+] Power Plugged :", battery.power_plugged)
En el código anterior, usamos el batería_sensores () función para obtener la información de la batería, como el porcentaje de batería, el tiempo restante, la alimentación enchufada o no. Al ejecutar el código en mi máquina, obtuve el siguiente resultado.
También podemos usar la biblioteca psutil para obtener las RPM (revoluciones por minuto) del ventilador) usando la función sensores_fan () mientras el ventilador está funcionando. El psutil también se puede utilizar para obtener la temperatura de varios dispositivos. Podemos hacerlo usando el Sensores_temperaturas () función de la psutil. Dejo esto para que lo haga usted para que practique.
Guión final
Ahora combinemos todos los códigos con la construcción de un programa final para recopilar todos los detalles del sistema y hardware que discutimos. Puede copiar el siguiente programa y ejecutarlo en su Python IDE.
# importing the required modules import platform from datetime import datetime import psutil import os # First We will print the basic system information # using the platform module print("nttt Basic System Informationn") print("[+] Architecture :", platform.architecture()[0]) print("[+] Machine :", platform.machine()) print("[+] Operating System Release :", platform.release()) print("[+] System Name :",platform.system()) print("[+] Operating System Version :", platform.version()) print("[+] Node: " + platform.node()) print("[+] Platform :", platform.platform()) print("[+] Processor :",platform.processor()) # Using the psutil library to get the boot time of the system boot_time = datetime.fromtimestamp(psutil.boot_time()) print("[+] System Boot Time :", boot_time) # getting the system up time from the uptime file at proc directory with open("/proc/uptime", "r") as f: uptime = f.read().split(" ")[0].strip() uptime = int(float(uptime)) uptime_hours = uptime // 3600 uptime_minutes = (uptime % 3600) // 60 print("[+] System Uptime : " + str(uptime_hours) + ":" + str(uptime_minutes) + " hours") # getting the total number of processes currently running pids = [] for subdir in os.listdir('/proc'): if subdir.isdigit(): pids.append(subdir) print('Total number of processes : {0}'.format(len(pids))) # Displaying The CPU information print("nttt CPU Informationn") # This code will print the number of CPU cores present print("[+] Number of Physical cores :", psutil.cpu_count(logical=False)) print("[+] Number of Total cores :", psutil.cpu_count(logical=True)) print("n") # This will print the maximum, minimum and current CPU frequency cpu_frequency = psutil.cpu_freq() print(f"[+] Max Frequency : {cpu_frequency.max:.2f}Mhz") print(f"[+] Min Frequency : {cpu_frequency.min:.2f}Mhz") print(f"[+] Current Frequency : {cpu_frequency.current:.2f}Mhz") print("n") # This will print the usage of CPU per core for i, percentage in enumerate(psutil.cpu_percent(percpu=True, interval=1)): print(f"[+] CPU Usage of Core {i} : {percentage}%") print(f"[+] Total CPU Usage : {psutil.cpu_percent()}%") # reading the cpuinfo file to print the name of # the CPU present with open("/proc/cpuinfo", "r") as f: file_info = f.readlines() cpuinfo = [x.strip().split(":")[1] for x in file_info if "model name" in x] for index, item in enumerate(cpuinfo): print("[+] Processor " + str(index) + " : " + item) # writing a function to convert bytes to GigaByte def bytes_to_GB(bytes): gb = bytes/(1024*1024*1024) gb = round(gb, 2) return gb # Using the virtual_memory() function it will return a tuple virtual_memory = psutil.virtual_memory() print("nttt Memory Informationn") #This will print the primary memory details print("[+] Total Memory present :", bytes_to_GB(virtual_memory.total), "Gb") print("[+] Total Memory Available :", bytes_to_GB(virtual_memory.available), "Gb") print("[+] Total Memory Used :", bytes_to_GB(virtual_memory.used), "Gb") print("[+] Percentage Used :", virtual_memory.percent, "%") print("n") # This will print the swap memory details if available swap = psutil.swap_memory() print(f"[+] Total swap memory :{bytes_to_GB(swap.total)}") print(f"[+] Free swap memory : {bytes_to_GB(swap.free)}") print(f"[+] Used swap memory : {bytes_to_GB(swap.used)}") print(f"[+] Percentage Used: {swap.percent}%") # Gathering memory information from meminfo file print("nReading the /proc/meminfo file: n") with open("/proc/meminfo", "r") as f: lines = f.readlines() print("[+] " + lines[0].strip()) print("[+] " + lines[1].strip()) # accessing all the disk partitions disk_partitions = psutil.disk_partitions() print("nttt Disk Informationn") # displaying the partition and usage information for partition in disk_partitions: print("[+] Partition Device : ", partition.device) print("[+] File System : ", partition.fstype) print("[+] Mountpoint : ", partition.mountpoint) disk_usage = psutil.disk_usage(partition.mountpoint) print("[+] Total Disk Space :", bytes_to_GB(disk_usage.total), "GB") print("[+] Free Disk Space :", bytes_to_GB(disk_usage.free), "GB") print("[+] Used Disk Space :", bytes_to_GB(disk_usage.used), "GB") print("[+] Percentage Used :", disk_usage.percent, "%") # get read/write statistics since boot disk_rw = psutil.disk_io_counters() print(f"[+] Total Read since boot : {bytes_to_GB(disk_rw.read_bytes)} GB") print(f"[+] Total Write sice boot : {bytes_to_GB(disk_rw.write_bytes)} GB") # gathering all network interfaces (virtual and physical) from the system if_addrs = psutil.net_if_addrs() print("nttt Network Informationn") # printing the information of eah network interfaces for interface_name, interface_addresses in if_addrs.items(): for address in interface_addresses: print(f"Interface :", interface_name) if str(address.family) == 'AddressFamily.AF_INET': print("[+] IP Address :", address.address) print("[+] Netmask :", address.netmask) print("[+] Broadcast IP :", address.broadcast) elif str(address.family) == 'AddressFamily.AF_PACKET': print("[+] MAC Address :", address.address) print("[+] Netmask :", address.netmask) print("[+] Broadcast MAC :",address.broadcast) # getting the read/write statistics of network since boot net_io = psutil.net_io_counters() print("[+] Total Bytes Sent :", bytes_to_GB(net_io.bytes_sent)) print("[+] Total Bytes Received :", bytes_to_GB(net_io.bytes_recv)) # Getting The battery Information battery = psutil.sensors_battery() print("nttt Battery Informationn") print("[+] Battery Percentage :", round(battery.percent, 1), "%") print("[+] Battery time left :", round(battery.secsleft/3600, 2), "hr") print("[+] Power Plugged :", battery.power_plugged)
Al ejecutar este código, obtendremos el siguiente resultado.
Si quieres mejorar el programa o quieres descargar el código, puedes hacerlo desde mi página de Github.
Conclusión
Este es el tutorial completo sobre cómo recopilar información interesante sobre el sistema y el hardware utilizando Python. Si tiene algún problema para copiar el código, también puede encontrar el código fuente completo en mi repositorio de Github. Es posible que también desee ver nuestra guía sobre cómo trabajar con el sistema operativo en Python para obtener algunos ajustes de Python más interesantes.
Deja una respuesta