UnsatisfiedLinkError при запуске функции setUID в Jetty9
Я только что попытался запустить Jetty 9 от имени пользователя без полномочий root, но безуспешно использовал функцию setuid для привязки малых номеров портов. Я включил setuid модуля в start.ini и добавил -Djava.library.path=/opt/jetty/lib/setuid Но у меня при запуске Jetty есть следующая трассировка стека:
2015-06-09 16: 27: 27.211: ПРЕДУПРЕЖДЕНИЕ:oejx.XmlConfiguration:main: Ошибка конфигурации при | | java.lang.reflect.InvocationTargetException в файле:/opt/jetty/etc/jetty-setuid.xml java.lang.reflect.InvocationTargetException в sun.reflect.NativeMethodAccessorImpl.invoke0(родной метод) в методе NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:606) в org.Mainst. (Main.java:321) в org.eclipse.jetty.start.Main.start(Main.java:817) в org.eclipse.jetty.start.Main.main(Main.java:112) . Причина: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) lang.reflect.Method.invoke (Method.java:606) в org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:479) в org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:411) в org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration) или XmlConfiguration.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1125) в org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1030) в org.ecl.xl.xl JettyXmlConfiguration.call(XmlConfiguration.java:721) в org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:417) в org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlfiguration (JetavaXmlConfiguration ():354) в org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:262) в org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1243) в java.security.AccessControlile.doPriv.jp Собственный метод) в org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174) ... еще 7 причин: java.lang.UnsatisfiedLinkError: org.eclipse.jetty.setuid.SetUID.getpwnam(Ljava/lang/String;)Lorg/eclipse/jetty/setuid/Passwd; в org.eclipse.jetty.setuid.SetUID.getpwnam (собственный метод) в org.eclipse.jetty.setuid.SetUIDListener.setUsername(SetUIDListener.java:53) ... еще 23
Это единственные ссылки на эту ошибку:
- dev.eclipse.org/mhonarc/lists/jetty-users/msg01657.html
- groups.google.com/forum/#!topic/dropwizard-user/aap2B_U_QPo
Но они либо остановлены, либо не показывают решения. Исходный код, который я нашел для пакета setuid: https://github.com/jetty-project/codehaus-jetty-project/blob/master/jetty-setuid/modules/java/src/main/java/org/mortbay/setuid/SetUID.java
Несмотря на то, что я не могу быть уверен, что это версия, которую я использую, учитывая, что она из пакета org.mortbay, в то время как Jetty 9 использует версию Eclipse.
Я попытался установить -Djetty.libsetuid.path в аргументах java (первый блок try-catch), либо добавить путь к переменной $PATH, либо установить -Djava.library.path (второй блок try-catch) или скопировать его в / lib и, наконец, оставить все как есть (третий блок try-catch) . Я получил один и тот же стек исключений во всех случаях. Я не могу быть уверен, что Jetty либо не найдет файл so, либо не сможет его загрузить, учитывая, что, если я удаляю все ссылки на путь (случаи, которые я описал последним), я все равно получаю то же сообщение об ошибке. Я использую Java7 для запуска Jetty.
Редактировать Я добавил следующий фрагмент к одному из моих веб-приложений в качестве теста, учитывая, что если веб-приложение выполнится успешно, я знаю, что проблема не в поиске общего объекта:
SetUID.setgid(1002);
SetUID.setuid(1002);
Passwd pw = SetUID.getpwuid(1002);
System.setProperty("user.name", pw.getPwName());
System.setProperty("user.home", pw.getPwDir());
У меня тот же UnsatisfiedLinkError в результате.
Edit2 Я попытался вместо этого следующее:
System.load(SetUID.__FILENAME);
SetUID.setgid(1002);
Который получил мне следующее сообщение об ошибке:
javax.servlet.ServletException: java.lang.UnsatisfiedLinkError: Собственная библиотека /lib/libsetuid.so уже загружена в другой загрузчик классов
Поэтому я могу заключить, что библиотека была загружена, по крайней мере.
1 ответ
Исследуя файл libsetuid (nm -D /path/to/the/so), я понял, что то, что я использовал, устарело и не было совместимо с Jetty 9, функции были названы mortbay:
root @ root: ~ / # nm -D libsetuid.so --size-sort | менее 0000000000000010 Т Java_org_mortbay_setuid_SetUID_setgid 0000000000000010 Т Java_org_mortbay_setuid_SetUID_setuid 0000000000000015 Т Java_org_mortbay_setuid_SetUID_setumask 0000000000000018 Т throwNewJavaSecurityException 0000000000000058 Т throwNewJavaException 000000000000008e Т Java_org_mortbay_setuid_SetUID_setrlimitnofiles 00000000000000a7 Т getJavaMethodId 00000000000000f5 Т Java_org_mortbay_setuid_SetUID_getrlimitnofiles 0000000000000102 Т getJavaFieldInt 0000000000000111 Т setJavaFieldInt 0000000000000111 Т setJavaFieldLong 0000000000000121 Т setJavaFieldString 00000000000001ba Т Java_org_mortbay_setuid_SetUID_getpwuid 00000000000001e5 Т Java_org_mortbay_setuid_SetUID_getpwnam 000000000000027e Т Java_org_mortbay_setuid_SetUID_getgrgid 000000000000029e Т Java_org_mortbay_setuid_SetUID_getgrnam
Теперь я использую общий объект, который уже загружен, а не тот, который указан в вики. В дополнение к этому, просматривая код модуля setuid, я решил использовать свойство -Djetty.libsetuid.path в моих аргументах java для указания абсолютного пути к библиотеке, например, -Djetty.libsetuid.path=/opt/ причал / Библиотека /setuid.so