2012-09-11 92 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