2010-02-23 19 views
6

Ich versuche, einen einfachen Python-basierten Webserver unter here auszuführen.Wie ändere ich Berechtigungen zu einem Socket?

Und bekomme ich folgende Fehlermeldung:

Traceback (most recent call last): 
    File "webserver.py", line 63, in <module> 
    main() 
    File "webserver.py", line 55, in main 
    server = HTTPServer(('', 80), MyHandler) 
    File "/usr/lib/python2.5/SocketServer.py", line 330, in __init__ 
    self.server_bind() 
    File "/usr/lib/python2.5/BaseHTTPServer.py", line 101, in server_bind 
    SocketServer.TCPServer.server_bind(self) 
    File "/usr/lib/python2.5/SocketServer.py", line 341, in server_bind 
    self.socket.bind(self.server_address) 
    File "<string>", line 1, in bind 
socket.error: (13, 'Permission denied') 

Soweit ich meine Firewall blockiert verstehen Zugang zu einer Steckdose? Habe ich recht? Wenn dies der Fall ist, wie kann ich die Berechtigungen ändern? Ist es gefährlich, diese Berechtigungen zu ändern?

Antwort

11

Wenn Sie an die Portnummern < 1024 binden möchten, müssen Sie root sein. Es ist keine Firewall Problem; Es wird vom Betriebssystem erzwungen. Hier sind a reference from w3.org, und ein FAQ entry speziell für Unix.

+0

http://www.unixguide.net/network/socketfaq/4.8.shtml –

+0

@ THC4k: Vielen Dank für die zusätzliche Referenz; Ich habe es in meine Antwort aufgenommen. –

2

Wenn Sie auf einem Port unter 1024 ausführen möchten, müssen Sie root sein. Sie können den Socket öffnen und die Berechtigung von root für den Rest Ihres Programms löschen, indem Sie zu einem anderen Benutzer wechseln.

In den meisten Fällen ist es einfacher, einen echten Webserver (zB nginx) auf Port 80 zu betreiben und die Anfragen an Ihr Programm weiterzuleiten, das Sie an einem hochnummerierten Port (zB 8080) ausführen können. Auf diese Weise müssen Sie sich keine Gedanken darüber machen, etwas während der Zeit, in der Ihr Prozess als root ausgeführt wird, zu vermischen, da es niemals als root ausgeführt wird.

Wenn es nur zum Testen ist, den Server auf Port 8080 laufen und eine Verbindung zu http://localhost:8080/

Verwandte Themen