
Der Kunde bittet uns, einen Nicht-Root-Benutzer zu erstellen, um unser Websystem auszuführen, das Port 512, kleiner als 1024, bindet. Wenn der Webserver (Anlegestelle) läuft, ist dies die Ausnahme:
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)
Ich habe also einige Lösungen gefunden, wie Nicht-Root-Benutzer Ports unter 1024 binden können. Die Lösung, die ich schließlich verwendete, bestand darin, „cap_net_bind_service“ durch Festlegen der Capabilities auf Java einzustellen. Der Befehl lautet:
sudo setcap cap_net_bind_service+eip /usr/lib/jvm/jdk1.7.0_25/bin/java
Aber wenn ich Jetty erneut starte, tritt ein weiterer Fehler auf:
[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
Auch wenn ich es ausführe java -version
, verursacht es eine Ausnahme:
[admin@VPRCEMSUSOFC04 bin]$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Aber wenn ich mich mit Root anmelde, ist alles in Ordnung:
[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)
Ich verstehe nicht, warum das passiert. Warum gibt es zwei verschiedene Ergebnisse für Root- und Nicht-Root-Benutzer? Es scheint, dass festgelegte Fähigkeiten dies beeinflussen.
Der Linux-Kernel ist 2.6.32-220.el6.x86_64. Das Betriebssystem ist Red Hat Enterprise Linux Server Release 6.2 (Santiago).
Antwort1
Die ausführbare Java-Datei basiert auf einer Funktion, dievom Kernel deaktiviert, wenn die ausführbare Datei zusätzliche Berechtigungen oder Fähigkeiten erhält, als Sicherheitsmaßnahme. Wenn Sie diese ausführbare Datei als Nicht-Root verwenden möchten, müssen Sie den Speicherort von libjli.so zu Ihrer Loader-Konfiguration hinzufügen (befindet sich in ) /etc/ld.so.conf*
.