一個非 root 使用者透過連接埠 512 運行 jetty,該連接埠小於連接埠 1024

一個非 root 使用者透過連接埠 512 運行 jetty,該連接埠小於連接埠 1024

客戶要求我們創建一個非root用戶來運行我們的Web系統,該用戶綁定連接埠512,小於1024。碼頭) 運行,這是例外:

2013-10-16 14:49:51.406:WARN::failed Server@2c2893ce: java.net.SocketException: Permission denied
2013-10-16 14:49:51.406:WARN::EXCEPTION
java.net.SocketException: Permission denied
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:444)
        at sun.nio.ch.Net.bind(Net.java:436)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)

所以我找到了一些關於非root使用者如何綁定小於1024埠的解決方案,最後我使用的解決方案是將「cap_net_bind_service」設定為java,透過set Capability,指令是:

sudo setcap cap_net_bind_service+eip /usr/lib/jvm/jdk1.7.0_25/bin/java

但是當我再次啟動jetty時,又發生了另一個錯誤:

[admin@VPRCEMSUSOFC04 bin]$ ./jetty.sh start
Starting Jetty: /usr/lib/jvm/jdk1.7.0_25/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

即使我執行時java -version,它也會引發異常:

[admin@VPRCEMSUSOFC04 bin]$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

但是當我用 root 登入時,就沒有問題了:

[root@VPRCEMSUSOFC04 etc]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

我不明白為什麼會發生這種情況。為什麼root和非root使用者下有兩種不同的結果。看來設定的能力會影響這一點。

Linux核心是2.6.32-220.el6.x86_64。作業系統是 Red Hat Enterprise Linux Server 版本 6.2(聖地牙哥)。

答案1

Java 執行檔依賴以下功能:當可執行檔獲得額外的權限或功能時被核心禁用,作為一項安全措施。如果您想以非 root 身份使用此可執行文件,那麼您需要將 libjli.so 的位置添加到您的載入器配置中,位於/etc/ld.so.conf*.

相關內容