¿Cómo usar Python Pexpect para automatizar los comandos de Linux?

Pexpect es una biblioteca de Python para generar procesos secundarios y controlarlos automáticamente. Pexpect se puede usar para automatizar aplicaciones interactivas como SSH, FTP, contraseña, telnet, etc. Pexpect funciona generando procesos secundarios y respondiendo a los patrones esperados.

Instalación:

Pexpect se puede instalar usando el siguiente comando.

pip3 install pexpect

Automatización de comandos de Linux:

Se puede hacer de diferentes maneras:

  • Usando el método ejecutar()
  • Usando la clase de generación
  • Usando el método sendline()

Después de la instalación, veamos cómo automatizar los comandos de Linux.

Método 1: Usando el método run()

Se puede llamar al método pexpect.run() para ejecutar un comando y devolver su salida. Esta función se puede utilizar como reemplazo de os.system.

Ejemplo:

Python3

import pexpect
 
print(pexpect.run('echo hello'))

Figura 1

Método 2: Usar la clase de generación

La clase Spawn es la interfaz principal para iniciar un nuevo proceso secundario y controlarlo. La string dentro de spawn puede ser reemplazada por el comando de shell que debe ejecutarse.

Sintaxis: pexpect.spawn(“rm ./dev”)

Los métodos importantes de la clase pexpect.spawn son expect().

Sintaxis: expect(patrón, tiempo de espera=-1, tamaño de la ventana de búsqueda=-1, async_= False)

Este método espera a que el proceso secundario devuelva una string determinada. El patrón especificado en el método de excepción coincidirá en toda la string. El tiempo de espera se utiliza para generar pexpect.TIMEOUT. El parámetro searchwindowsize se usa para establecer el atributo maxread de la clase. Establezca async_ = True al crear una aplicación sin bloqueo.

Ejemplo:

Python3

import pexpect
 
# start a child  process with spawn
# It just echos  geeksforgeeks
child = pexpect.spawn("echo geeksforgeeks")
 
# prints he matched index of string.
print(child.expect(["hai", "welcome", "geeksforgeeks"]))

Producción:

Figura 2

El ejemplo imprime el índice que coincide con el proceso secundario.

Método 3: Usando la línea de envío ( s = ” “ )

Este método escribe la string en el proceso secundario y también devuelve el número de bytes escritos. Al proceso secundario le parece que alguien está escribiendo desde la terminal. 

Ejemplo:

Python3

import pexpect
 
# Start a child process with spawn
# This process  waits for the input
# form user
child = pexpect.spawn("cat")
 
# The input to the cat process is sent
# by the sendline()
child.sendline("hai geek")
 
# prints the index of matched string
# expressing with child process
print(child.expect(["hello", "hai geek"]))

Producción:

Fig. 3

Veamos un ejemplo complejo para una mejor comprensión. Aquí, donde usará el cliente FTP para iniciar sesión en ftp.us.debian.org y descargar el archivo welcome.msg e imprimir el archivo. Aquí vamos a utilizar un cliente FTP para iniciar sesión y descargar archivos desde una máquina remota y luego imprimir.

Acercarse:

  • Importación esperada.
  • genera un hijo con pexpect.spawn(‘ftp ftp.us.debian.or’).
  • El cliente FTP solicita el nombre de usuario. Haga coincidir el patrón con expect(‘Nombre .*: ‘)
  • Envíe el nombre de usuario al proceso secundario con el método sendline.
  • Luego, el cliente FTP solicita la contraseña. Haga coincidir el patrón con expect(‘Contraseña:’)
  • Luego, el servicio inició sesión. Luego puede descargar archivos.
  • Detecte si puede enviar el comando al servidor FTP por la presencia de ‘ftp>’.
  • Luego envíe el comando por sendline(‘get welcome.msg’), esto solo descarga el archivo a la máquina local.
  • Luego cierre el cliente FTP usando el comando ‘bye’.
  • Finalmente, imprima todas las interacciones con el proceso secundario con child.before. Devuelve una string de bytes, la decodifica antes de imprimirla.
  • Utilice pexpect.run para imprimir el contenido del archivo descargado desde el servidor FTP.

Python3

import pexpect
 
 
def main():
 
    # spawn a child process.
    child = pexpect.spawn('ftp ftp.us.debian.org')
 
    # search for the Name pattern.
    child.expect('Name .*: ')
 
    # send the username with sendline
    child.sendline('anonymous')
 
    # search for the  Password pattern
    child.expect('Password:')
 
    # send the password to the childprocess
    # by sendline
    child.sendline('anonymous@')
 
    # detect ftp accepts command from user
    # by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # If  it accepts command then download the
    # welcome.msg file from the ftp server
    child.sendline('get welcome.msg')
 
    # again check whether ftp client accepts
    # command from user by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # close the ftp client.
    child.sendline('bye')
 
    # print the interactions with the child
    # process.
    print(child.before.decode())
    child.interact()
 
    # print the downloaded file by executing cat
    # command with pexpect.run method
    print(pexpect.run('cat ./welcome.msg').decode())
 
 
if __name__ == '__main__':
    main()

Producción:

higo 4

Publicación traducida automáticamente

Artículo escrito por kabilan 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 *