Python | Ejecutar y analizar comandos de Linux

Prerrequisito: Introducción a Linux Shell y Shell Scripting

Linux es uno de los sistemas operativos más populares y es una opción común para los desarrolladores. Es popular porque es de código abierto, es gratuito y personalizable, es muy robusto y adaptable.

Un sistema operativo consta principalmente de dos partes: el kernel y el Shell. El kernel básicamente maneja la comunicación entre el software y el hardware. El shell toma entradas o comandos del usuario y produce una salida. La mayoría de las distribuciones de Linux hoy en día usan el shell BASH (Bourne back shell). Los comandos y scripts de Shell son muy potentes y los desarrolladores los usan comúnmente.

En este artículo, veremos cómo ejecutar y analizar comandos de Linux usando python.

Subproceso –

Subprocess es un módulo en Python que nos permite iniciar nuevas aplicaciones o procesos en Python. Este módulo pretende reemplazar varios módulos antiguos en python. Podemos usar este módulo para ejecutar otros programas o ejecutar comandos de Linux.

Iniciar un proceso –

Se puede generar un nuevo proceso utilizando la función Popen definida en el módulo de subproceso. Es un constructor de la clase Popen que toma argumentos para configurar el nuevo proceso. La creación y gestión de procesos subyacentes en este módulo está a cargo de la clase Popen.

Argumentos:

  1. El primer parámetro es una lista que contiene los comandos y sus opciones, si las hay.
    ej: ['ls', '-l']
    el ejemplo anterior es equivalente a escribir ‘ls -l’ en la terminal
  2. El segundo parámetro es el valor de salida estándar. especifica la salida estándar.
    ej: stdout = subprocess.PIPE
    Esto indica que se debe crear una nueva tubería o redirección. El valor predeterminado es
    «Ninguno», lo que significa que no se producirá ninguna redirección.

Podemos recuperar la salida de un comando usando la función de comunicación . Lee datos de stdout y stderr hasta que llega al final del archivo y espera a que finalice el proceso. Devuelve una tupla que contiene los datos de salida y el error, si lo hubiera.

Sintaxis:

data = subprocess.Popen(['ls', '-l', filename], stdout = subprocess.PIPE)
output = data.communicate()

La salida del comando ejecutado se almacena en datos. Usando estas funciones, podemos ejecutar comandos de Linux y obtener su salida.

Listado de directorios –

Podemos usar el comando ‘ls’ con opciones como ‘-l’, ‘-al’, etc. para listar todos los archivos en el directorio actual. Luego podemos analizar esta salida e imprimirla en un formato presentable. La get_permissions()función analiza la salida del comando list y recupera solo los nombres de los archivos y sus permisos correspondientes.

# importing libraries
import subprocess
import os
  
# a function to list the files in
# the current directory and 
# parse the output.
def list_command(args = '-l'):
  
    # the ls command
    cmd = 'ls'
  
    # using the Popen function to execute the
    # command and store the result in temp.
    # it returns a tuple that contains the 
    # data and the error if any.
    temp = subprocess.Popen([cmd, args], stdout = subprocess.PIPE)
      
    # we use the communicate function
    # to fetch the output
    output = str(temp.communicate())
      
    # splitting the output so that
    # we can parse them line by line
    output = output.split("\n")
      
    output = output[0].split('\\')
  
    # a variable to store the output
    res = []
  
    # iterate through the output
    # line by line
    for line in output:
        res.append(line)
  
    # print the output
    for i in range(1, len(res) - 1):
        print(res[i])
  
    return res
  
# parse the output of the ls 
# command and fetch the permissions
# of the files and store them in 
# a text file .
def get_permissions():
  
    # get the output of the 
    # list command
    res = list_command('-l')
  
    permissions = {}
      
    # iterate through all the rows
    # and retrieve the name of the file
    # and its permission.
    for i in range(1, len(res) - 1):
        line = res[i]
  
        line = line.split(' ')
  
        folder_name = line[len(line) - 1]
        permission_value = line[0]
  
        permissions[folder_name] = permission_value
  
    # create a directory called
    # outputs to store the output files
    try:
        os.mkdir('outputs')
  
    except:
  
        pass
  
    os.chdir('outputs')
  
    # open the output file
    out = open('permissions.txt', 'w')
  
    out.write('Folder Name   Permissions\n\n')
  
    # write to the output file
    for folder in permissions:
  
        out.write(folder + ' : ' + permissions[folder] + '\n')
  
    os.chdir('..')
    return permissions
  
if __name__ == '__main__':
    list_command('-al')

Producción :

Comando de ping –

El comando ping significa Packet Internet Groper. Se usa más comúnmente para verificar la conectividad entre dos sistemas o Nodes. Usando el comando ping, podemos verificar si la conexión entre un Node y otro es saludable o no. Intercambia paquetes de datos entre dos Nodes y también calcula el tiempo de ida y vuelta.

# importing libraries
import subprocess
import os
  
# a function to ping given host
def ping(host):
  
    # command is pong
    cmd = 'ping'
  
    # send two packets of data to the host
    # this is specified by '-c 2' in the 
    # args list
    temp = subprocess.Popen([cmd, '-c 2', host], stdout = subprocess.PIPE)
      
    # get the output of ping
    output = str(temp.communicate())
          
    output = output.split("\n")
      
    output = output[0].split('\\')
  
    # variable to store the result
    res = []
  
    for line in output:
        res.append(line)
  
    # print the results
    print('ping results: ')
    print('\n'.join(res[len(res) - 3:len(res) - 1]))
  
    return res
  
  
if __name__ == '__main__':
          
    # ping google
    ping('www.google.com')

Producción :

Cambiar permisos –

El chmod comando se puede utilizar para cambiar los permisos de archivo. Es una abreviatura de modo de cambio. Más información se puede encontrar aquí

# importing libraries
import subprocess
import os
  
  
# functio to change the permissions
# of a given file
def change_permissions(args, filename):
  
    # command name
    cmd = 'chmod'
  
    # getting the permissions of
    # the file before chmod
    ls = 'ls'
  
    data = subprocess.Popen([ls, '-l', filename], stdout = subprocess.PIPE)
  
    output = str(data.communicate())
  
    print('file permissions before chmod % s: ' %(args))
    print(output)
  
    # executing chmod on the specified file
    temp = subprocess.Popen([cmd, args, filename], stdout = subprocess.PIPE)
  
    # getting the permissions of the 
    # file after chmod
    data = subprocess.Popen([ls, '-l', filename], stdout = subprocess.PIPE)
  
    output = str(data.communicate())
  
    # printing the permissions after chmod
    print('file permissions after chmod % s: ' %(args))
    print(output)
  
if __name__ == '__main__':
          
    # changing the permissions of 'sample.txt' 
    change_permissions('755', 'sample.txt')

Producción :

Publicación traducida automáticamente

Artículo escrito por Adith Bharadwaj y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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