es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecutar df | grep -w “/” no está analizando correctamente la salida.

Estoy intentando ejecutar el comando de shell df -h | grep -w "/" utilizando Python para supervisar el uso de la partición raíz y quiero evitar la opción shell=True por motivos de seguridad.

El código que intenté es el siguiente:

import subprocess
p1 = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', '-w', '"/"'], stdin=p1.stdout, stdout=subprocess.PIPE)
output = p2.communicate()[0]
print(output)

La salida que obtengo es:

b''

La salida esperada es:

$ df -h | grep -w "/"
/dev/sdd        251G  4.9G  234G   3% /
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para evitar usar la opción shell=True por razones de seguridad, puedes usar la función subprocess.run(), disponible a partir de Python 3.5. Esta función puede tomar el comando de la terminal como una lista de cadenas, sin requerir que se genere una terminal. Aquí tienes el fragmento de código modificado usando subprocess.run():

    import subprocess
    
    df_process = subprocess.run(['df', '-h'], stdout=subprocess.PIPE)
    grep_output = subprocess.run(['grep', '-w', '/'], input=df_process.stdout, stdout=subprocess.PIPE)
    print(grep_output.stdout.decode())
    

    En este código, primero ejecutamos el comando df -h usando subprocess.run() y almacenamos la salida en una variable llamada df_process. Luego ejecutamos el comando grep -w / usando subprocess.run(), pasando la salida del comando anterior como entrada. Capturamos la salida estándar de grep usando el parámetro stdout e imprimimos la salida decodificada en la consola.

    La salida de este código debería coincidir con la salida esperada que proporcionaste:

    /dev/sdd        251G  4.9G  234G   3% /
    

Comments are closed.