2010-02-23 3 views
6

J'essaie d'exécuter un simple serveur web basé sur Python donné here.Comment modifier les autorisations sur une socket?

Et je reçois le message d'erreur suivant:

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') 

Pour autant que je comprends mes pare-feu bloque l'accès à une prise? Ai-je raison? Si c'est le cas, comment puis-je changer les permissions? Est-ce dangereux de changer ces permissions?

Répondre

11

Si vous voulez lier les numéros de port < 1024, vous devez être root. Ce n'est pas un pare-feu numéro ; il est appliqué par le système d'exploitation. Voici a reference from w3.org, et un FAQ entry spécifique à Unix.

+0

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

+0

@ THC4k: Merci pour la référence supplémentaire; Je l'ai incorporé dans ma réponse. –

2

Si vous souhaitez utiliser un port inférieur à 1024, vous devez être root. Vous pouvez ouvrir le socket et supprimer l'autorisation de root pour le reste de votre programme en basculant vers un autre utilisateur.

La plupart du temps, il est plus facile d'exécuter un vrai serveur web (disons nginx) sur le port 80 et de transmettre les requêtes à votre programme que vous pouvez exécuter sur un port haut (8080 par exemple). De cette façon, vous n'avez pas à vous soucier de visser quelque chose pendant que votre processus s'exécute en tant que root, car il ne fonctionne jamais en tant que root.

Si c'est juste pour tester, exécuter le serveur sur le port 8080 et se connecter à http://localhost:8080/

Questions connexes