回答
我知道kchuid它确实确切地说,虽然它似乎被放弃,但它看起来不会很难带来最新的。
也就是说,我工作的hosting company确实允许(在共享托管包上)用户在端口80上运行他们自己的Web服务器 - 包括Tomcat-。这是通过使用名为authbind的工具完成的,该工具不需要服务器以root用户身份启动,但只允许非root用户绑定到选定的IP地址和选定的端口。
唯一的问题是,authbind将无法与Java的网络抽象层默认。您需要禁用Java的IPV6支持,并可能指定一个特定的 IP地址绑定到您的应用程序中。前者可以通过使用-Djava.net.preferIPv4Stack=true
启动JRE来完成,但后者是特定于应用程序的。
虽然进程可以放弃自己的权限,但我认为您不能更改另一个正在运行的进程的用户。
您可以通过系统调用seteuid(http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html)在您自己的应用程序代码中执行此操作,但是通过bash脚本或其他方式执行此操作,但我不确定。为什么不首先像普通用户那样开始流程呢?
你能解释一下为什么你想这样做?通常最好定义一个具有所需权限的用户(请参阅"Principle of Least Privilege")并以该用户身份运行该用户。
您可以创建一个单独的程序,该程序以root权限启动(例如通过使用二进制setuid),执行需要权限的工作,使用setuid删除权限,最后执行tomcat。
根据您尝试解决什么问题,这可能会也可能不是解决方案。例如。如果你需要以更高的优先级运行服务器,这将工作。
您需要的底层系统调用是setuid(2)
,但它没有被任何Java API公开。
不难写一个JNI包装,将它送给接入不过,尽管后来连你需要找到在Tomcat启动代码合适的地方调用bind(2)
已吁请之后setuid
(它们是:那些通常需要root权限的人)。
根据geocar的推荐,您可以使用authbind
,这样Tomcat永远不需要以根用户身份运行。
另外,由于您大概在服务器上获得了根访问权限,只需在非特权端口上运行Tomcat,然后使用iptables
技巧将入站请求从特权端口转发到Tomcat实际正在侦听的端口上。有关如何执行此操作的信息,请参阅this SO post。
- 1. 文件所有者无法在Linux中更改所有权
- 2. Linux - 篡改现有进程
- 3. Linux用户更改所有者/组
- 4. 在Node.js中更改文件所有者
- 5. 在java中更改目录所有者
- 6. 在Windows中更改文件所有者
- 7. 更改所有者为ReentrantLock
- 8. redshift更改udf更改所有者
- 9. Linux - QNAP - 无法更改文件夹的所有者
- 10. 无法更改群组所有者(群组所有者意图)
- 11. 更改存储库中所有文档的所有者
- 12. 更改目录中所有内容的所有者
- 13. Linux更改组权限以匹配所有者权限
- 14. 更改活动的事件所有者
- 15. Android开发者控制台 - 更改应用程序所有者
- 16. 在Linux中更改进程名称
- 17. 已更改数据库所有者
- 18. 更改表所有者w CockroachDB
- 19. 获取所有进程id进程名在linux
- 20. 通过SNMP获取进程所有者
- 21. 语言C - 获取进程所有者
- 22. 你如何在sql中更改数据库的所有者?
- 23. 如何在Amazon S3中更改多个文件的所有者?
- 24. PHP - 在运行时更改进程的所有权
- 25. 在Sphinx重启后自动将searchd.production.pid所有权更改为所需所有者
- 26. 如何在ms sql server中更改架构所有者?
- 27. 如何通过PowerShell更改TFS更改集所有者
- 28. 在mercurial central repository中推送更改会更改所有者和组
- 29. 更改在服务器上传的文件的所有者
- 30. 如何更换一个单词中出现的所有UNIX/LINUX
可能是因为他想听特权(<1024)端口! – Alnitak 2009-01-09 19:12:28