2009-01-09 119 views

回答

2

我知道kchuid它确实确切地说,虽然它似乎被放弃,但它看起来不会很难带来最新的。

也就是说,我工作的hosting company确实允许(在共享托管包上)用户在端口80上运行他们自己的Web服务器 - 包括Tomcat-。这是通过使用名为authbind的工具完成的,该工具不需要服务器以root用户身份启动,但只允许非root用户绑定到选定的IP地址和选定的端口。

唯一的问题是,authbind将无法​​与Java的网络抽象层默认。您需要禁用Java的IPV6支持,并可能指定一个特定的 IP地址绑定到您的应用程序中。前者可以通过使用-Djava.net.preferIPv4Stack=true启动JRE来完成,但后者是特定于应用程序的。

0

虽然进程可以放弃自己的权限,但我认为您不能更改另一个正在运行的进程的用户。

0

你能解释一下为什么你想这样做?通常最好定义一个具有所需权限的用户(请参阅"Principle of Least Privilege")并以该用户身份运行该用户。

+1

可能是因为他想听特权(<1024)端口! – Alnitak 2009-01-09 19:12:28

0

您可以创建一个单独的程序,该程序以root权限启动(例如通过使用二进制setuid),执行需要权限的工作,使用setuid删除权限,最后执行tomcat。

根据您尝试解决什么问题,这可能会也可能不是解决方案。例如。如果你需要以更高的优先级运行服务器,这将工作。

4

您需要的底层系统调用是setuid(2),但它没有被任何Java API公开。

不难写一个JNI包装,将它送给接入不过,尽管后来连你需要找到在Tomcat启动代码合适的地方调用bind(2)已吁请之后setuid(它们是:那些通常需要root权限的人)。

根据geocar的推荐,您可以使用authbind,这样Tomcat永远不需要以根用户身份运行。

另外,由于您大概在服务器上获得了根访问权限,只需在非特权端口上运行Tomcat,然后使用iptables技巧将入站请求从特权端口转发到Tomcat实际正在侦听的端口上。有关如何执行此操作的信息,请参阅this SO post