2012-06-13 35 views
7

estoy corriendo el siguiente comando desde mi directorio home:Python CGIHTTPServer bloquea con "OSError: [Errno 13] Permiso denegado"

python -m CGIHTTPServer 

Esto ejecuta el servidor, pero cuando intento acceder a un script en el directorio cgi-bin Obtengo:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/CGIHTTPServer.py", line 251, in run_cgi 
    os.execve(scriptfile, args, env) 
OSError: [Errno 13] Permission denied 

Ejecutar como root no hace la diferencia. Los archivos parecen tener todos los permisos correctos:

[email protected]:~$ ls -lhR 
.: 
total 12K 
drwxr-xr-x 2 student student 4.0K Jun 13 18:38 cgi-bin 
drwxr--r-- 2 student student 4.0K Jun 10 2004 kalpy 
-rwxrwxrwx 1 student student 2.0K Jun 13 12:37 test.html 

./cgi-bin: 
total 8.0K 
-rwxr-xr-x 1 student student 31 Jun 13 18:38 test.py 

Editar: El contenido de test.py es:

#!/usr/bin/python 
print "test" 

El tinglado es válido:

~$ which python 
/usr/bin/python 
+1

Sería útil ver la línea _shebang_ de 'test.py'. Ese error puede surgir si el intérprete definido no es un ejecutable válido. – rodrigo

+0

Gracias @rodrigo, edité mi pregunta para incluir esta información. – qwertyboy

Respuesta

9

¿Está usted, por casualidad, ejecutando el proceso como root?

Si utiliza la fuente, se verá en CGIHTTPServer.py, justo antes de llamar execve:

try: 
    os.setuid(nobody) 
except os.error: 
    pass 

Es decir, se ejecutará la secuencia de comandos CGI como nadie, si es capaz de cambiar el UID , eso es si es raíz. Si no es root, probablemente esta llamada fallará y pasará.

Así que supongo que está ejecutando el servidor como root, por lo que el script se ejecuta como nobody, pero este usuario no tiene acceso al script. Lo que se espera, como dices, está en tu directorio de inicio.

dos soluciones que se me ocurren:

  • El recomendada: no ejecute el servidor como root!
  • La solución alternativa: copie el script en un directorio donde nadie puede leerlo (/tmp por ejemplo).
+0

Gracias @rodrigo - lo has clavado. – qwertyboy

1

En lo personal, a menos que haya alguna razón que desconozco, recomendaría usar subprocess.Popen en lugar de os.execve. Me he encontrado con Errno 13 antes, tratando de iniciar un .app con Popen (['open execName.app']). Tuve que usar Popen (['execName.app/Contents/MacOS/execName', 'arg1', 'arg2' ...]) en su lugar. No sé si eso ayuda, pero pruébalo.

+0

No estoy seguro de seguirte, @DaveTheScientist, ¿estás sugiriendo que aplique un parche a CGIHTTPServer? – qwertyboy

0

Cuando se ejecuta en Windows, los archivos se ejecutan directamente fuera de las instrucciones del comando.

¡Para usuarios de Linux y Windows ese no es el caso!

me sale el siguiente error:

Rastreo (llamada más reciente pasado): File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/server.py", línea 1158, en run_cgi os.execve (el archivo de guión, args, env) PermissionError: [Errno 13] Permiso denegado:

Necesitará lo siguiente para resolver estos problemas:

Para usuarios de Linux:

1) Asegurar tinglado es ajustados para Python 3 se ejecuta en sistemas Linux y Mac OSX:

#!/usr/bin/env python3

2) Dado que los archivos ejecutables originales fueron escritos en las ventanas que van ocultos han '\ r' en los archivos que deben ser eliminados. Aquí hay tres formas posibles: a) En la línea de comandos del terminal escriba: tr -d ‘\r’ < input file name > output file name (simplemente cambie el nombre del archivo de salida por un nuevo nombre -> borrar archivo antiguo -> vuelva a cambiar el nombre del archivo de salida al original) b) En la línea de comandos del terminal escriba : cat inputfile | col -b > outputfile (apenas cambie el nombre del archivo de salida un nuevo nombre -> borrar el archivo viejo -> luego rechange archivo de salida de nuevo a originales) c) Descargar dos2unix, a continuación, escriba en la línea de comando en el terminal: dos2unix nombre de archivo de entrada

3) Hacer archivo ejecutable: En tipo de línea de comando en el terminal: a) chmod 755 nombre de archivo o b) chmod + x fichero o chmod a + x Filen AME

Para usuarios de Mac OSX es casi la misma:

  1. Repita el paso 1) desde Linux
  2. Repita el paso 2) desde Linux

Para el paso 3 cosas cambian:

Basado en la página wiki de apache.org: https://wiki.apache.org/httpd/13PermissionDenied Dice que debe hacer que todos los ejecutables desde la ubicación del archivo atraviesen todo hasta el directorio raíz/Usuarios.

Tendrá que hacer lo siguiente.

3) En la línea de comandos de terminal:

a) type command: `cd /Users` 
b) type command: `sudo chmod -R 755` 

Ahora puede ejecutar el archivo .py servidor a través de:

sudo webserver.py 

y el archivo de entrada a través de la normalidad:

python3 inputfile.py 

¡Ahora deberías estar bien sin más errores de permiso! Puede realizar los ajustes necesarios en shebang y en la línea de comandos si ejecuta Python 2.

1

Me encontré con el mismo problema de ubuntu Linux. Siguió la solución de "Mike", con modificación. En lugar de hacer chmod del "/ usr" que tiene varias carpetas, cambie los permisos de la carpeta que contiene el archivo ejecutable que fue denegado. (Puede verificar que el servidor funcione correctamente al cargar un archivo html estático en la misma ubicación, y muestra un error solo cuando se ejecuta el script).

cd /pathto/folder/with/deniedscript 
sudo chmod -R 755 ./ 

Ahora la secuencia de comandos tiene permiso, por lo que debe funcionar bien. Tenga en cuenta que -R otorga permiso a todos los archivos en esta carpeta (y subcarpetas, si corresponde).

Cuestiones relacionadas