example español python shell subprocess

example - subprocess python español



Cuándo utilizar el módulo de subproceso Shell=True para Python (2)

Si shell es True , el comando especificado se ejecutará a través del shell. Esto puede ser útil si está usando Python principalmente para el flujo de control mejorado que ofrece sobre la mayoría de las capas del sistema y aún desea un acceso conveniente a otras funciones de shell tales como shell pipes, wildcards de nombre de archivo, expansión de variable de entorno y expansión de ~ al hogar de un usuario directorio.

Cuando shell=True es peligroso?

Si ejecutamos comandos de shell que pueden incluir entradas no optimizadas de una fuente que no es de confianza , hará que un programa sea vulnerable a la inyección de shell , una falla de seguridad grave que puede dar como resultado la ejecución de comandos arbitrarios. Por esta razón, el uso de shell=True se desaconseja fuertemente en los casos en que la cadena de comandos se construye a partir de entrada externa

P.ej. (Tomado de documentos )

>>> from subprocess import call >>> filename = input("What file would you like to display?/n") What file would you like to display? non_existent; rm -rf / # >>> call("cat " + filename, shell=True) # Uh-oh. This will end badly..

Esta pregunta ya tiene una respuesta aquí:

Parece que cada vez que trato de usar el módulo de subproceso de Python, me parece que todavía no entiendo algunas cosas. Actualmente, estaba intentando unir 3 archivos mp4 desde un módulo de Python.

Cuando lo intenté

z =''MP4Box -cat test_0.mp4 -cat test_1.mp4 -cat test_2.mp4 -new test_012d.mp4'' subprocess.Popen(z,shell=True)

Todo funcionó.

Cuando lo intenté

z = [''MP4Box'', ''-cat test_0.mp4'', ''-cat test_1.mp4'', ''-cat test_2.mp4'', ''-new test_012d.mp4''] subprocess.Popen(z,shell=False)

Tuve el siguiente error:

Option -cat test_0.mp4 unknown. Please check usage

Pensé que para shell=False solo necesitaba proporcionar una lista donde el primer elemento era el ejecutable que quería ejecutar y cada elemento siguiente era un argumento para ese ejecutable. ¿Estoy equivocado en esta creencia, o hay una forma correcta de crear el comando que quería usar?

Además, ¿existen reglas para usar Shell=True en el subproceso.Popen? Hasta ahora, todo lo que sé (?) Es "no lo hagas, puedes exponer tu código a los ataques de inyección de Shell". ¿Por qué Shell=False evita este problema? ¿Hay alguna vez una ventaja real al usar ''Shell = True''?


Tienes que dar cada argumento como un elemento de una lista:

z = [''MP4Box'', ''-cat'', ''test_0.mp4'', ''-cat'', ''test_1.mp4'', ''-cat'', ''test_2.mp4'', ''-new'', ''test_012d.mp4''] subprocess.Popen(z,shell=False)

Normalmente, esto es lo que quiere hacer, ya que no necesita escapar caracteres especiales del shell en los nombres de archivo.