python中的smtp代理需要根身份验证才能运行

python中的smtp代理需要根身份验证才能运行,python,linux,proxy,permission-denied,smtpd,Python,Linux,Proxy,Permission Denied,Smtpd,我在Linux上有以下简单的python代码 import smtpd proxy = smtpd.PureProxy(('0.0.0.0',25), None) 当作为sudo运行时,它运行正常,但当作为标准用户运行时,会出现socket.error:[Errno 13]权限被拒绝的错误。我的问题是:如何使此代码段与普通用户一起运行 谢谢 Alex如果要绑定到端口25(或1024以下的任何端口),则必须是root用户。但是,您可以在套接字绑定完成后更改为其他用户 >>> i

我在Linux上有以下简单的python代码

import smtpd
proxy = smtpd.PureProxy(('0.0.0.0',25), None)
当作为sudo运行时,它运行正常,但当作为标准用户运行时,会出现
socket.error:[Errno 13]权限被拒绝的错误。我的问题是:如何使此代码段与普通用户一起运行

谢谢


Alex

如果要绑定到端口25(或1024以下的任何端口),则必须是root用户。但是,您可以在套接字绑定完成后更改为其他用户

>>> 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
>>> 

当然,这是一种单向操作。一旦您更改为其他用户,就不能再更改用户。

Linux只允许根进程侦听1024以下的端口。至少您的进程必须以root身份启动,打开套接字,然后删除root权限。请参阅。。。是否有任何代码片段显示如何做到这一点?我可以想象的是,用sudo启动一个python文件(打开套接字,在后台运行),另一个python代码可以由普通用户使用该套接字运行。这可能吗,有一些代码吗?这个答案可能会有帮助:这种方法似乎有效,但不能回答我的问题。如果我想要不可能的,我的问题永远不会得到回答。但是,即使我使用这个代码段,我也无法使用我在本地bash/terminal中设置的环境变量。我将尝试完全不同的方法来解决我的实际问题。谢谢您的回答。@Alex如果您必须以用户身份启动进程,则必须使用1024以上的端口。您可以创建一个基于主机的防火墙规则(iptables),将所有流量从端口25转发到绑定到1024以上的端口。但请注意,我的回答是公认的或标准的方式;大多数守护进程的编写方式。我建议您将实现更改为不需要环境变量,如果这是阻止您以“正确”方式执行的原因。