2012-12-15 14 views
11

Obecnie pracuję nad projektem utworzenia serwera TCP na Macu Mountain Lion. Napisałem skrypt o nazwie: Server.pytwisted.internet.error.CannotListenError: Nie można nasłuchiwać na żadnej: 80: [Errno 13] Odmowa uprawnień

ramach tego skryptu Pythona, użyłem twisted słuchać na porcie 80, jak pokazano poniżej:

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

Jak zawsze jestem coraz błędy jako takie:

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. 

Myślę, że to dlatego, że skrypt tcp.py ma złe uprawnienia dla administratora? lub czy jest jakiś sposób na ustawienie uprawnień na porcie < 1024? (Aby zmienić uprawnienia, w jaki sposób wpłynęłoby to na bezpieczeństwo takiego serwera?)

Każde lepsze rozwiązanie jest oceniane.

Odpowiedz

9

Rozwiązałem ten problem, używając polecenia sudo + uruchomienie serwera.

+1

Pomóż mi. Ale czy możesz wyjaśnić, dlaczego potrzebujemy "sudo" na początku? – iPatel

+1

W systemie operacyjnym domyślnie niektóre czynności są dozwolone tylko przez administratorów. Umieszczenie "sudo" przed poleceniem, a następnie podanie poświadczeń użytkownika oznacza, że ​​autoryzujesz taką akcję. Uruchomienie serwera oznacza zezwolenie na dostęp do Internetu, który może nałożyć zagrożenie bezpieczeństwa, więc ma sens, aby zezwalał na to tylko administrator tego komputera. – shorttermmem

+0

Dzięki za poprawę mojej wiedzy. – iPatel

5

Wygląda na to, że jesteś na dobrej drodze. Zgodnie z konwencją tylko superużytkownik (lub, w niektórych nowszych systemach, zwykły użytkownik, któremu przyznano pewne specjalne uprawnienia) może łączyć się z portami poniżej 1024.

Narzędzie authbind to przydatny sposób na udzielenie tego przywilej dla nie-super-użytkowników. Wygląda na to, że jest to port OS X, https://github.com/Castaglia/MacOSX-authbind (chociaż korzystałem tylko z authbind w Linuksie).

Innym podejściem jest, aby launchd powiązał port i przekazał go Twisted programowi. To podejście jest bardziej typowe dla tego, co można znaleźć w systemie OS X i jest realizowane przy użyciu (całkiem niedawno wprowadzonego) interfejsu API IReactorSocket.adoptStreamPort. Zapoznaj się z dokumentacją launchd, aby uzyskać szczegółowe informacje na temat konfiguracji tego i jak Twisted program dowie się, gdzie gniazdo do adoptowania.

+0

twisted.internet.error.CannotListenError: Nie można słuchać na dowolnym: 80: [ERRNO 48] adres już w użyciu. Czy kiedykolwiek doświadczyłeś takiego błędu. W przypadku większości postów na forum, [Errno 98] był bardzo często narzekał, ale nie 48. Użyłem "lsof -i: 80" do sprawdzenia działających procesów wiążących się z tym portem 80, a następnie zabiłem wszystkie z nich, w tym Internet. przeglądarka używająca "sudo kill PID". Jednak problem pozostaje. Teraz jestem taki zdezorientowany. – shorttermmem

+1

Możliwe jest używanie portu, nawet jeśli żaden program go aktualnie nie słucha. Przez dwie minuty po wysłuchaniu programu, który nas podsłuchiwał (lub w inny sposób zamknął gniazdo nasłuchu), połączenia TCP mogą pozostać w stanie TIME_WAIT. Zapobiegają one odsłuchiwaniu nowego portu przez gniazdo. Jednak Twisted używa funkcji SO_REUSEADDR interfejsu API gniazda BSD, aby uniknąć tego problemu. –

+1

Podczas gdy czasami możesz zauważyć błąd "Adres już w użyciu", nawet gdy żaden program nie słucha już portu, prawdopodobnie nie dzieje się to tutaj. Jest bardziej prawdopodobne, że jakiś program naprawdę nadal korzysta z portu. Jest bardzo mało prawdopodobne, aby przeglądarka internetowa kiedykolwiek nasłuchiwała na porcie 80, więc możesz źle interpretować wyniki swoich narzędzi. Sprawdź ponownie. –

21

Po prostu przejdź do terminala i wpisz sudo python server.py. Teraz poprosi o hasło, wpisz swoje hasło. Twój problem zostanie rozwiązany. Szczęśliwe kodowanie:

+1

Pomoc dla mnie. Ale czy możesz wyjaśnić, dlaczego potrzebujemy "sudo" na początku? – iPatel

2

Może twój tcp46 używa twojego 80. WYŁĄCZ SWOJE NARZĘDZIE, WSZYSTKO BĘDZIE KOLOROWE.

sudo apachectl zatrzymać

Powiązane problemy