
客戶要求我們創建一個非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*
.