2012-12-15 18 views
11

Attualmente sto lavorando a un progetto per creare un server TCP su mac os mountain lion. Ho scritto uno script chiamato: Server.pytwisted.internet.error.CannotListenError: Impossibile ascoltare su qualsiasi: 80: [Errno 13] Autorizzazione negata

In questo script python, ho usato contorto di ascoltare su porta 80 come illustrato di seguito:

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

Come mai sto ottenendo gli errori in quanto tali:

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. 

Sto pensando è perché lo script tcp.py ha l'autorizzazione sbagliata per l'utente amministratore? o c'è un modo per impostare i permessi sulla porta < 1024? (Per modificare l'autorizzazione, in che modo influenzerebbe la sicurezza di un server di questo tipo?)

Qualsiasi soluzione migliore è accolta.

risposta

9

Ho risolto questo problema utilizzando il comando sudo + avviando il server.

+1

Aiuto per me. Ma puoi spiegare perché abbiamo bisogno di "sudo" all'inizio? – iPatel

+1

Nel SO, per impostazione predefinita ci sono alcune azioni consentite solo dagli amministratori. Mettere "sudo" prima del comando quindi fornire le credenziali dell'utente significa fondamentalmente che stai autorizzando un'azione del genere. Avviare un server significa consentire l'accesso a Internet che può imporre minacce alla sicurezza, quindi ha senso che solo gli amministratori di questa macchina possano farlo. – shorttermmem

+0

Grazie per migliorare le mie conoscenze. – iPatel

5

Sembra che tu sia sulla strada giusta. Per convenzione, solo un superutente (o, in alcuni sistemi più recenti, un utente normale a cui sono stati concessi determinati poteri speciali) può collegarsi a porte inferiori a 1024.

Lo strumento authbind è un modo pratico per garantire questo privilegio per i non super utenti. Sembra che ci sia una porta OS X, https://github.com/Castaglia/MacOSX-authbind (sebbene io abbia usato sempre authbind su Linux, io stesso).

Un altro approccio è quello di lanciare il binding della porta per te e consegnarlo al tuo programma Twisted. Questo approccio è più tipico di ciò che potresti trovare persone che fanno su OS X, ed è realizzato usando l'API IReactorSocket.adoptStreamPort introdotta abbastanza recentemente. Vedere la documentazione di launchd per i dettagli su come configurarlo e su come il tuo programma Twisted apprenderà dove deve essere adottato il socket.

+0

twisted.internet.error.CannotListenError: Impossibile ascolto su qualsiasi: 80: [Errno 48] Indirizzo già in uso. Hai mai riscontrato un simile errore. Per la maggior parte dei post sul forum, [Errno 98] si è lamentato molto, ma non 48. Ho usato "lsof -i: 80" per controllare i processi in esecuzione che si legano a questa porta 80, quindi li ho uccisi tutti, incluso il web browser che usa "sudo kill PID". Tuttavia, il problema rimane. Sono così confuso ora. – shorttermmem

+1

È possibile che una porta sia in uso anche se nessun programma è attualmente in ascolto su di essa. Fino a due minuti dopo che il programma in ascolto è uscito (o chiuso in altro modo il socket di ascolto), le connessioni TCP potrebbero rimanere nello stato TIME_WAIT. Questi impediscono ad un nuovo socket di rimanere in ascolto sulla porta. Tuttavia, Twisted utilizza la funzionalità SO_REUSEADDR dell'API socket BSD per evitare questo problema. –

+1

Quindi, anche se a volte è possibile vedere un errore "Indirizzo già in uso" anche dopo che nessun programma è in ascolto su una porta, probabilmente non è ciò che sta accadendo qui. È più probabile che alcuni programmi stiano ancora utilizzando la porta. È altamente improbabile che un browser Web possa mai essere in ascolto sulla porta 80, pertanto è possibile che si stia interpretando erroneamente l'output dei propri strumenti. Controlla di nuovo. –

21

Basta andare al terminale e digitare sudo python server.py. Ora chiederà la password, digitare la password. Il tuo problema sarà risolto. Felice codifica

+1

Aiuto per me. Ma puoi spiegare perché abbiamo bisogno di "sudo" all'inizio? – iPatel

2

Forse il tuo tcp46 usa il tuo 80. SPEGNERE LE TUE APACHE, TUTTO SARÀ FINE.

sudo apachectl fermare

Problemi correlati