回答
我知道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. 在Mac/Linux上更改進程的用戶所有者?
- 2. 文件所有者無法在Linux中更改所有權
- 3. Linux - 篡改現有進程
- 4. Linux用戶更改所有者/組
- 5. 更改所有者
- 6. 在linux中更改文件夾的所有者
- 7. 在Node.js中更改文件所有者
- 8. 在java中更改目錄所有者
- 9. 在Windows中更改文件所有者
- 10. 更改所有者爲ReentrantLock
- 11. 更改表所有者
- 12. redshift更改udf更改所有者
- 13. Linux - QNAP - 無法更改文件夾的所有者
- 14. 無法更改羣組所有者(羣組所有者意圖)
- 15. 更改存儲庫中所有文檔的所有者
- 16. Linux更改組權限以匹配所有者權限
- 17. 如何在Linux內核中查找打開的inode的所有者進程?
- 18. 在linux中使用sudoers將文件的所有者從用戶更改爲root
- 19. 更改活動的事件所有者
- 20. 如何更改git repo的所有者?
- 21. 如何更改rsync的所有者
- 22. Android開發者控制檯 - 更改應用程序所有者
- 23. 在Linux中更改進程名稱
- 24. 在Linux中更改進程標識
- 25. 更改共享所有者C#
- 26. CRM 2013更改數據庫所有者
- 27. gulp chown不會更改所有者
- 28. 更改NFS共享所有者
- 29. 文件所有者更改顯示NSPopover
- 30. 已更改數據庫所有者
可能是因爲他想聽特權(<1024)端口! – Alnitak 2009-01-09 19:12:28