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.