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.

Índice

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.

información básica del sistema usando python
información básica del sistema usando python

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.

tiempo de arranque del sistema usando Python
tiempo de arranque del sistema usando python

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.

tiempo de actividad del sistema usando Python
tiempo de actividad del sistema usando Python

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.

número total de procesos
número total de procesos

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.

información de la cpu usando psutil
Información de la CPU usando psutil

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.

información de la cpu mediante el archivo cpuinfo
Información de la CPU mediante el archivo cpuinfo

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.

información de la memoria usando psutil
información de la memoria usando psutil

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 de la memoria usando el archivo meminfo

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.

información del disco usando python

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.

información de red usando python
información de red usando python

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.

información de la batería usando python
información de la batería usando python

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.

una herramienta para extraer información del sistema y del hardware usando Python
una herramienta para extraer información del sistema y del hardware usando Python

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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir