在Linux中更改现有进程的所有者

时间:2009-01-09 17:21:07

标签: linux tomcat redhat

我想以特权用户身份启动tomcat(Web Server),然后在启动后将其恢复给非特权用户。有没有办法以编程方式,或一般用Linux?

感谢。

6 个答案:

答案 0 :(得分:4)

您需要的基础系统调用是setuid(2),但任何Java API都不会公开它。

编写一个可以访问它的JNI包装器并不难,尽管如此,你需要在Tomcat启动代码中找到一个合适的位置,以便在setuid之后调用bind(2)已经进行了调用(那些通常需要root权限的调用)。

根据geocar的建议,您可以使用authbind,以便Tomcat根本不需要以root用户身份运行。

或者,因为您可能在相关服务器上获得root访问权限,只需在非特权端口上运行Tomcat,然后使用iptables技巧将特权端口的入站请求转发到Tomcat的端口实际上正在倾听。有关如何执行此操作的信息,请参阅this SO post

答案 1 :(得分:2)

我知道kchuid 完全那个,虽然看起来已经放弃了,但看起来并不难以更新。

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

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

答案 2 :(得分:1)

您可以通过系统调用seteuid(http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html)在自己的应用程序代码中执行此操作,但是通过bash脚本或其他方式执行此操作,我不确定。为什么不首先以普通用户身份启动流程?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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