
고객은 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 미만의 포트를 바인딩하는 방법에 대한 몇 가지 솔루션을 찾았습니다. 마침내 제가 사용한 솔루션은 "cap_net_bind_service"를 Java로 설정하고 Capability를 설정하여 명령은 다음과 같습니다.
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입니다. OS는 Red Hat Enterprise Linux Server 릴리스 6.2(Santiago)입니다.
답변1
Java 실행 파일은 다음과 같은 기능을 사용합니다.실행 파일이 추가 권한이나 기능을 획득하면 커널에 의해 비활성화됩니다., 안전 조치로. 이 실행 파일을 루트가 아닌 사용자로 사용하려면 로더 구성에 libjli.so 위치를 추가해야 합니다 /etc/ld.so.conf*
.