2012-12-15 3 views
11

Ich arbeite gerade an einem Projekt, um einen TCP-Server auf Mac OS Berglöwe zu erstellen. Ich schrieb ein Skript namens: Server.pytwisted.internet.error.CannotListenError: Konnte nicht abhören: 80: [Errno 13] Berechtigung verweigert

Innerhalb dieses Python-Skript, ich verdrehte verwendet 80 auf Port zu hören, wie unten dargestellt:

reactor.listenTCP(80, factory) 
reactor.run() 

Wie auch immer ich bin immer Fehler als solche:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/posixbase.py", line 436, in listenTCP 
    p.startListening() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/tcp.py", line 641, in startListening 
    raise CannotListenError, (self.interface, self.port, le) 
twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 13] Permission denied. 

Ich denke, ist es weil das tcp.py-Skript die falsche Berechtigung für Admin-Benutzer hat? Oder gibt es eine Möglichkeit, die Berechtigung für den Port < 1024 zu setzen? (Um die Berechtigung zu ändern, wie würde sich dies auf die Sicherheit eines solchen Servers auswirken?)

Es werden alle besseren Lösungen angeboten.

Antwort

9

Ich löste dieses Problem mit dem Befehl sudo + Starten des Servers.

+1

Hilfe für mich. Aber kannst du bitte erklären, warum wir beim Start "Sudo" brauchen? – iPatel

+1

In OS sind standardmäßig einige Aktionen nur von Administratoren erlaubt. Setzen Sie "sudo" vor dem Befehl und geben Sie dann die Anmeldeinformationen des Benutzers an, was bedeutet, dass Sie eine solche Aktion autorisieren. Das Starten eines Servers bedeutet, dass der Zugriff auf das Internet möglich ist, was Sicherheitsbedrohungen zur Folge haben kann. Daher ist es sinnvoll, dass nur der Administrator dieser Maschine dies tun darf. – shorttermmem

+0

Danke für die Verbesserung meiner Kenntnisse. – iPatel

5

Es klingt, als ob Sie auf dem richtigen Weg sind. Per Konvention darf nur ein Superuser (oder in einigen neueren Systemen ein normaler Benutzer, dem bestimmte Sonderrechte gewährt wurden) an Ports unter 1024 binden.

Das Tool authbind ist eine praktische Möglichkeit, dies zu gewährleisten Privileg für Nicht-Super-Benutzer. Es scheint einen OS X Port zu geben, https://github.com/Castaglia/MacOSX-authbind (obwohl ich nur authbind unter Linux selbst benutzt habe).

Ein anderer Ansatz ist es, launchd den Port für Sie zu binden und es an Ihr Twisted-Programm zu übergeben. Dieser Ansatz ist typischer für das, was Benutzer unter OS X finden können, und wird mithilfe der (kürzlich eingeführten) API IReactorSocket.adoptStreamPort durchgeführt. In der Launchd-Dokumentation finden Sie Einzelheiten darüber, wie Sie dies konfigurieren und wie Ihr Twisted-Programm herausfinden wird, wo der Socket eingesetzt werden soll.

+0

twisted.internet.error.CannotListenError zu stoppen: auf jede nicht hören konnte: 80: [Errno 48] Adresse bereits verwendet wird. Haben Sie schon einmal einen solchen Fehler erlebt? Für die meisten Posts im Forum wurde [Errno 98] oft beschwert, aber nicht 48. Ich habe "lsof -i: 80" verwendet, um laufende Prozesse zu überprüfen, die an diesen Port 80 gebunden sind, und dann alle, einschließlich des Webs, gelöscht Browser mit "sudo kill PID". Das Problem bleibt jedoch bestehen. Ich bin jetzt so verwirrt. – shorttermmem

+1

Es ist möglich, dass ein Port verwendet wird, auch wenn gerade kein Programm darauf hört. Bis zu zwei Minuten, nachdem das Programm, das überwacht wurde, den abhörenden Socket verlassen hat (oder anderweitig geschlossen hat), können TCP-Verbindungen im Zustand TIME_WAIT verbleiben. Diese verhindern, dass ein neuer Socket den Port abhört. Twisted verwendet jedoch die SO_REUSEADDR-Funktion der BSD-Socket-API, um dieses Problem zu vermeiden. –

+1

So, während Sie manchmal einen Fehler "Adresse bereits verwendet" sehen können, auch wenn kein Programm mehr auf einen Port hört, ist das wahrscheinlich nicht, was hier passiert. Es ist wahrscheinlicher, dass ein Programm wirklich immer noch den Port benutzt. Es ist sehr unwahrscheinlich, dass ein Web-Browser jemals Port 80 überwacht, sodass Sie die Ausgabe Ihrer Tools möglicherweise falsch interpretieren. Nochmal Überprüfen. –

21

Gehen Sie einfach zum Terminal und geben Sie sudo python server.py ein. Jetzt wird es Passwort fragen, geben Sie Ihr Passwort ein. Dein Problem wird gelöst. Happy coding

+1

Hilfe für mich. Aber kannst du bitte erklären, warum wir beim Start "Sudo" brauchen? – iPatel

2

Vielleicht ist Ihre tcp46 Ihre 80. Schalten Sie Ihren APACHE, alles wird gut.

sudo apachectl