2012-06-13 11 views
7

ich aus meinem Home-Verzeichnis den folgenden Befehl leite:Python CGIHTTPServer stürzt mit "OSError: [Errno 13] Permission denied"

python -m CGIHTTPServer 

Dieser den Server läuft, aber wenn ich versuche, ein Skript in dem für den Zugriff auf cgi-bin directory Ich erhalte:

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 

Laufen als root macht keinen Unterschied. Die Dateien scheinen die richtigen Rechte:

[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 

Edit: Der Inhalt test.py ist:

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

Die shebang gilt:

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

Es wäre nützlich, die Zeile _shebang_ aus 'test.py' zu sehen. Dieser Fehler kann auftreten, wenn der definierte Interpreter keine gültige ausführbare Datei ist. – rodrigo

+0

Danke @rodrigo, ich habe meine Frage bearbeitet, um diese Information einzubeziehen. – qwertyboy

Antwort

9

Werden Sie den Prozess zufällig als root ausführen?

Wenn Sie die Quelle verwenden , werden Sie in CGIHTTPServer.py, sehen nur execve vor dem Aufruf:

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

Das heißt, es wird das CGI-Skript als niemand laufen, wenn es die UID zu ändern ist in der Lage Das ist, wenn es Root ist. Wenn es nicht root ist, wird dieser Aufruf höchstwahrscheinlich fehlschlagen und weitergeben.

Also meine Vermutung ist, dass Sie den Server als root ausführen, so wird das Skript als niemand ausgeführt, aber dieser Benutzer hat keinen Zugriff auf das Skript. Was erwartet wird, wie Sie sagen, dass es in Ihrem Heim-Verzeichnis ist.

Zwei Lösungen, die ich mir vorstellen kann:

  • Die empfohlene: den Server nicht als root ausführen!
  • Die Problemumgehung: Kopieren Sie das Skript in ein Verzeichnis, in dem Niemand es lesen kann (/tmp zum Beispiel).
+0

Danke @rodrigo - Sie haben es geschafft. – qwertyboy

1

persönlich, es sei denn es gibt Ein Grund warum mir nicht bewusst ist, ich würde subprocess.Popen anstelle von os.execve empfehlen. Ich bin schon auf Errno 13 gestoßen und habe versucht, eine .app mit Popen (['open execName.app']) zu starten. Ich musste stattdessen Popen (['execName.app/Contents/MacOS/execName', 'arg1', 'arg2' ...]) verwenden. Ich weiß nicht, ob das hilft, aber versuchen Sie es.

+0

Ich bin mir nicht sicher, ob ich dir folge, @DaveTheScientist, schlägst du vor, dass ich CGIHTTPServer patch? – qwertyboy

0

Bei der Ausführung unter Windows laufen die Dateien direkt aus den Eingabeaufforderungen.

Für Linux- und Windows-Benutzer ist das nicht der Fall!

bekomme ich folgende Fehlermeldung:

Traceback (jüngste Aufforderung zuletzt): Die Datei "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/server.py", Zeile 1158, in run_cgi os.execve (Script, args, env) PermissionError: [Errno 13] Erlaubnis verweigert:

Sie die folgenden benötigen diese Probleme zu beheben:

Für Linux-Benutzer:

1) Stellen Sie sicher, shebang ist angepasst für Python 3 läuft auf Linux und Mac OSX Systeme:

#!/usr/bin/env python3

2) Da die ursprünglichen ausführbaren Dateien auf Windows geschrieben wurden sie versteckt haben werde ‚\ r‘ in den Dateien, die entfernt werden müssen. Hier sind drei mögliche Wege: a) In der Terminal-Befehlszeile geben Sie tr -d ‘\r’ < input file name > output file name (benennen Sie die Ausgabedatei einen neuen Namen -> alte Datei löschen -> dann Ausgabedateiname zurück zum Original) b) In Terminal-Befehlszeile Typ : cat inputfile | col -b > outputfile (nur die Ausgabedatei einen neuen Namen umbenennen -> löschen alte Datei -> dann zu den ursprünglichen Ausgabedatei zurück rechange) c) Download dos2unix, geben Sie dann Terminal-Befehlszeile in: dos2unix Eingabedatei Name

3 Make) ausführbare Datei: In Terminalbefehlszeilentyp: a) chmod 755 Dateinamen oder b) chmod + x Dateinamen oder chmod a + x DateiN am

Für Mac OSX Benutzer es fast das gleiche ist:

  1. Wiederholen Sie Schritt 1) ​​von Linux
  2. Wiederholen Sie Schritt 2) von Linux

Für Schritt 3 Dinge ändern:

Basierend auf der apache.org Wiki-Seite: https://wiki.apache.org/httpd/13PermissionDenied Es heißt, dass Sie jede ausführbare Datei vom Speicherort der Datei alle weg machen müssen bis zum/Users root-Verzeichnis.

Sie müssen Folgendes tun.

3) In Terminal-Befehlszeile:

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

Jetzt können Sie Ihre Server-Py-Datei über laufen:

sudo webserver.py 

und die Eingabedatei über normal:

python3 inputfile.py 

Jetzt sollten Sie alle gut sein, mit keine Erlaubnisfehler mehr zu gehen! Sie können notwendige Anpassungen an Shebang und Kommandozeile vornehmen, wenn Sie Python 2 ausführen.

1

Ich stieß auf das gleiche Problem von Ubuntu Linux. Folgte der Lösung von "Mike", mit Änderungen. Stattdessen chmod des "/ usr", das mehrere Ordner hat, ändern Sie die Berechtigungen des Ordners mit ausführbaren Datei, die verweigert wurde. (Sie können überprüfen, ob der Server beim Laden einer statischen HTML-Datei am selben Speicherort ordnungsgemäß ausgeführt werden kann, und zeigt nur dann einen Fehler an, wenn das Skript ausgeführt wird).

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

Jetzt hat das Skript die Erlaubnis, sollte also gut laufen. Beachten Sie, dass -R allen Dateien in diesem Ordner (und ggf. Unterordnern) die Berechtigung erteilt.

Verwandte Themen