2012-12-15 137 views
11

我目前正在開發一個項目,以在mac os mountain lion上創建TCP服務器。我寫了一個叫腳本:Server.pytwisted.internet.error.CannotListenError:無法偵聽任何:80:[Errno 13]權限被拒絕

在這個python腳本,我用雙絞線端口時80聽,如下圖所示:

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

我如何過得到錯誤這樣:

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. 

我在想這是因爲tcp.py腳本對管理員用戶的權限有誤嗎?或者有沒有辦法在端口< 1024上設置權限? (要更改權限,它將如何影響此類服務器的安全性?)

任何更好的解決方案都可以應用。

回答

9

我使用命令sudo +啓動服務器來解決此問題。

+1

對我有幫助。但是你能解釋一下爲什麼我們需要開始「sudo」嗎? – iPatel

+1

在OS中,默認情況下,只有管理員才允許執行某些操作。在命令之前放置「sudo」,然後提供用戶憑據基本上意味着您正在授權此類操作。啓動服務器意味着允許訪問互聯網,這可能會帶來安全威脅,因此,只有該機器的管理員才能執行此操作。 – shorttermmem

+0

謝謝你提高我的知識。 – iPatel

5

這聽起來像你在正確的軌道上。按照慣例,只允許超級用戶(或者,在一些較新的系統中,已被授予某些特殊功能的普通用戶)綁定到1024以下的端口。

authbind工具是一種方便的方法來授予此特權給非超級用戶。似乎有一個OS X端口,https://github.com/Castaglia/MacOSX-authbind(儘管我只用過Linux上的authbind,我自己)。

另一種方法是讓launchd爲您綁定端口並將其交給Twisted程序。這種方法更爲典型,你可能會發現人們在OS X上做的事情,並且使用(最近推出的)IReactorSocket.adoptStreamPort API來完成。請參閱launchd文檔以獲取有關如何配置它的詳細信息,以及Twisted程序將如何瞭解它要採用的套接字的位置。

+0

twisted.internet.error.CannotListenError:任何無法聽:80:[錯誤48]在使用中已地址。 你有沒有經歷過這樣的錯誤。對於論壇上的大多數帖子,[Errno 98]已被抱怨了很多,但不是48.我確實使用「lsof -i:80」來檢查正在運行的進程綁定到這個端口80,然後殺死所有這些包括web瀏覽器使用「sudo kill PID」。但是,問題依然存在。我現在很困惑。 – shorttermmem

+1

即使沒有程序正在監聽端口,端口也可能正在使用。在正在監聽的程序退出(或以其他方式關閉監聽套接字)後,最多兩分鐘,TCP連接可能會保持TIME_WAIT狀態。這些阻止了新的套接字在端口上偵聽。但是,Twisted使用BSD套接字API的SO_REUSEADDR功能來避免此問題。 –

+1

因此,即使在沒有程序監聽端口後,有時您可能會看到「地址已在使用中」錯誤,但這可能不是這裏發生的情況。有些程序更可能還在使用該端口。網絡瀏覽器不太可能在端口80上進行監聽,所以你可能會誤解你的工具的輸出。再檢查一遍。 –

21

只要進入終端並鍵入sudo python server.py。現在它會詢問密碼,輸入您的密碼。你的問題將得到解決。快樂編碼

+1

幫助我。但是你能解釋一下爲什麼我們需要開始「sudo」嗎? – iPatel

2

也許你的tcp46正在使用你的80. 關掉你的APACHE,一切都將是美好的。

須藤的apachectl停止

相關問題