2012-09-11 129 views
0

我有以下簡單的Python代碼的LinuxSMTP代理服務器要求身份驗證根運行

import smtpd 
proxy = smtpd.PureProxy(('0.0.0.0',25), None) 

,當作爲sudo的運行運行良好,但作爲標準用戶運行時給出了一個socket.error: [Errno 13] Permission denied錯誤。我的問題:我如何使這個片段與普通用戶一起運行。

感謝,

亞歷

+2

Linux只允許root進程偵聽1024以下的端口。至少你的進程必須以root身份啓動,打開套接字,然後刪除root權限 –

+0

我看到了...是否有任何代碼片斷顯示做完了?我可以想象的是,用sudo(打開套接字,在後臺運行)啓動一個python文件,並使用此套接字可以由普通用戶運行另一個python代碼。這是可能的,有沒有一些代碼? – Alex

+0

這個答案可能有所幫助:http://stackoverflow.com/questions/1770209/run-child-processes-as-different-user-from-a-long-running- process –

回答

2

如果你要綁定到端口25(或1024以下的端口),你必須是根。但是,您可以在套接字綁定完成後更改爲其他用戶。

>>> import os 
>>> import smtpd 
>>> import pwd 
>>> uid = pwd.getpwnam('nobody').pw_uid 
>>> gid = pwd.getpwnam('nobody').pw_gid 
>>> proxy = smtpd.PureProxy(('0.0.0.0',25), None) 
>>> os.setgid(gid) 
>>> os.setuid(uid) 
>>> os.system('whoami') 
nobody 
0 
>>> 

這當然是單向操作。一旦你改變到另一個用戶,你不能再改變用戶。

+0

這種似乎工作,但不是回答我的問題。如果我想要不可能的話,我的問題將永遠不會被回答。但是,即使我使用這個片段,我也無法使用我在本地bash /終端中設置的環境變量。我會嘗試完全不同的東西來解決我的實際問題。感謝您的回答。 – Alex

+1

@Alex如果您必須以您的用戶身份啓動進程,則必須使用1024以上的端口。您可以創建基於主機的防火牆規則(iptables),以將端口25的所有通信轉發到您綁定到1024以上的端口。但請注意,我的答案是接受的或標準的方式;大多數守護進程都是這樣寫的。我建議你改變你的實現,不要求環境變量,如果這是什麼阻止你做'正確'的方式。 – tMC