我想通过golang制作自定义网络服务器。
它需要root才能绑定到端口80。
但是我想尽快删掉root。
syscall.SetUid()
根据ticket #1435返回“不支持”。
我总是可以通过iptables将端口80重新路由到其他地方,但是这会打开任何非root进程来构建我的网络服务器 - 我不希望这样做。
如何删除应用程序的权限(或者干净地解决此问题)。
答案 0 :(得分:3)
我会做@JimB建议的。
另一方面,在Linux上还有另一个技巧:您可以使用os/exec.Command()
执行/proc/self/exe
,同时告诉它在SysProcAttr.Credential
os/exec.Cmd
字段中使用替代凭据它生成的实例。
请参阅go doc os/exec.Cmd
,go doc syscall.SysProcAttr
和go doc syscall.Credential
。
确保当您重新执行程序时,需要确保生成的程序将其标准I / O流连接到其父程序,并且还继承了所有必需的打开文件。 / p>
另一个值得一提的替代方案是,根本不尝试绑定到端口80,并在那里挂一个合适的Web服务器,然后反向代理基于主机名的虚拟主机或特定的URL路径前缀(或前缀)到你的Go进程监听任何TCP或Unix套接字。 Apache(至少2.4)和Nginx都可以轻松完成。