Entrega de archivos Python CGI en un Synology NAS

Oct 19 2020

No puedo hacer que los archivos de Python se sirvan con Apache 2.2 o 2.4 sin un error 500. Tengo WebStation instalado, python, perl, php y Apache 2.2 y 2.4 instalados.

Puedo servir archivos estáticos muy bien con apache. Cuando trato de ofrecer un CGI de "hola mundo" más básico, obtengo un error 500. El error es

[cgid: error] [pid 10076: tid 140542621480832] (2) No existe tal archivo o directorio: AH01241: exec de ['/volume2/Development/WebRepo/cgi-bin/test.py' falló.

Intenté ejecutar tanto un script en perl como un script en python. Ambos se ejecutan correctamente desde una línea de comandos, pero no desde el servidor Apache (los mismos errores de "no existe tal archivo ..."). También tenga en cuenta que este es un error 500, no 404, por lo que está viendo el archivo. Puedo servir archivos HTML estáticos muy bien.

El script de Python no podría ser más simple:

#!/usr/bin/python
print "Content-type: text/html\n\n";
print "Hello, World.";

Todos los archivos tienen 755 permisos. El camino a Python es correcto. No sé qué hacer a continuación.

Respuestas

1 saaj Nov 29 2020 at 21:26

Python puede servir scripts CGI listos para usar, usando http.server.CGIHTTPRequestHandler.

En mi Synology NAS tengo instalado el paquete oficial de Python3 (versión 3.8.2-0150). Puedo SSH en NAS adminy agregar un script:

mkdir -p app/cgi-bin

cat << EOF > app/cgi-bin/hello.py
#!/usr/bin/env python3

print('Content-Type: text/html')
print()
print('<html><body><h2>Hello World!</h2></body></html>')
EOF

Después de eso, puedo ejecutarlo así (tenga en cuenta que --directoryno tiene efecto, --cgiasí que estoy cdallí):

cd app && python3 -m http.server --cgi

Luego, en mi máquina, puedo curl http://nas:8000/cgi-bin/hello.py.

Ejecutando en el arranque

Puede ejecutar esto automáticamente al arrancar mediante el programador de tareas.

Panel de control → Programador de tareas → Crear → Tarea activada → Script definido por el usuario . Complete estos en la pestaña General :

  • Tarea: Python CGI
  • Usuario: admin
  • Habilitado: [x]

Y script definido por el usuario en la pestaña Configuración de tareas :

cd /var/services/homes/admin/app
python3 -m http.server --cgi

Entonces puedes ejecutarlo manualmente. También debería ejecutarse al reiniciar.

Permisos

Si desea ejecutar la tarea como root, asegúrese de que los permisos de archivo sean correctos desde rootel punto de vista. En mi caso, hay discrepancia por alguna razón.

$ ls -l app/cgi-bin/hello.py -rwxrwxrwx+ 1 admin users 122 Nov 29 14:50 app/cgi-bin/hello.py $ sudo ls -l app/cgi-bin/hello.py 
Password: 
-rwx--x--x+ 1 admin users 122 Nov 29 14:50 app/cgi-bin/hello.py