고객은 웹 시스템을 실행하기 위해 루트가 아닌 사용자를 생성하도록 요구합니다. 이 사용자는 1024보다 작은 포트 512에 바인딩됩니다. 웹 서버(교각), 이는 예외입니다.
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)
그래서 루트가 아닌 사용자가 1024보다 작은 포트를 바인딩할 수 있는 방법에 대한 몇 가지 솔루션을 찾았고, 결국 사용한 솔루션은 set Capability를 통해 "cap_net_bind_service"를 java로 설정하는 것이었습니다. 명령은 다음과 같습니다.
sudo setcap cap_net_bind_service+eip /usr/lib/jvm/jdk1.7.0_25/bin/java
하지만 부두를 다시 시작하면 또 다른 오류가 발생합니다.
[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@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)
왜 이런 일이 발생하는지 이해하지 못합니다. 루트 사용자와 루트가 아닌 사용자에게 서로 다른 두 가지 결과가 나타나는 이유는 무엇입니까? 설정 기능이 이에 영향을 미치는 것 같습니다.
Linux 커널은 2.6.32-220.el6.x86_64입니다. 운영 체제는 Red Hat Enterprise Linux Server 버전 6.2(San Diego)입니다.
답변1
Java 실행 파일은 다음 기능을 사용합니다.실행 파일이 추가 권한이나 기능을 얻을 때 커널에 의해 비활성화됩니다., 안전 조치로. 이 실행 파일을 루트가 아닌 사용자로 사용하려면 로더 구성에 libjli.so 위치를 추가해야 합니다 /etc/ld.so.conf*
.