Bereitstellen von Python-CGI-Dateien auf einem Synology NAS

Oct 19 2020

Ich kann keine Python-Dateien erhalten, die mit Apache 2.2 oder 2.4 ohne einen 500-Fehler bereitgestellt werden. Ich habe WebStation installiert, Python, Perl, PHP und Apache 2.2 und 2.4 installiert.

Ich kann statische Dateien gut mit Apache bereitstellen. Wenn ich versuche, ein grundlegendstes "Hallo Welt" -Cgi zu servieren, erhalte ich einen Fehler von 500. Der Fehler ist

[cgid: error] [pid 10076: tid 140542621480832] (2) Keine solche Datei oder kein solches Verzeichnis: AH01241: Exec von ['/volume2/Development/WebRepo/cgi-bin/test.py' ist fehlgeschlagen.

Es wurde versucht, sowohl ein Perl-Skript als auch ein Python-Skript auszuführen. Beide werden erfolgreich über eine Befehlszeile ausgeführt, jedoch nicht über Apache (dieselben Fehler wie "Keine solche Datei ..."). Beachten Sie auch, dass dies ein 500-Fehler ist, kein 404-Fehler, sodass die Datei angezeigt wird. Ich kann statische HTML-Dateien problemlos bereitstellen.

Das Python-Skript könnte nicht einfacher sein:

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

Alle Dateien haben 755 Berechtigungen. Der Pfad zu Python ist korrekt. Ich weiß nicht, was ich als nächstes tun soll.

Antworten

1 saaj Nov 29 2020 at 21:26

Python kann CGI-Skripte sofort mit bereitstellen http.server.CGIHTTPRequestHandler.

Auf meinem Synology NAS ist das offizielle Python3-Paket installiert (Version 3.8.2-0150). Ich kann SSH in NAS als adminund ein Skript hinzufügen:

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

Danach kann ich es so ausführen (Notiz, --directorydie keine Wirkung hat, --cgialso bin ich cdda):

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

Dann kann ich auf meiner Maschine curl http://nas:8000/cgi-bin/hello.py.

Laufen beim Booten

Sie können dies beim Booten automatisch über den Taskplaner ausführen.

Systemsteuerung → Taskplaner → Erstellen → Ausgelöste Aufgabe → Benutzerdefiniertes Skript . Füllen Sie diese auf der Registerkarte Allgemein aus :

  • Aufgabe: Python CGI
  • Benutzer: admin
  • Aktiviert: [x]

Und benutzerdefiniertes Skript auf der Registerkarte Aufgabeneinstellungen :

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

Dann können Sie es manuell ausführen. Es sollte auch beim Neustart ausgeführt werden.

Berechtigungen

Wenn Sie die Aufgabe als ausführen möchten root, stellen Sie sicher, dass die Dateiberechtigungen aus rootSicht der Benutzer korrekt sind . In meinem Fall gibt es aus irgendeinem Grund Diskrepanzen.

$ 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