我只是尝试以非root用户身份运行Jetty 9,使用setuid功能而没有成功绑定低端口号。 我在start.ini中启用了模块setuid并添加了-Djava.library.path = / opt / jetty / lib / setuid 但是在启动Jetty时我有以下堆栈跟踪:
2015-06-09 16:27:27.211:警告:oejx.XmlConfiguration:main:配置错误 在| | java中的java.lang.reflect.InvocationTargetException 文件:/opt/jetty/etc/jetty-setuid.xml java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) 在org.eclipse.jetty.start.Main.invokeMain(Main.java:321) 在org.eclipse.jetty.start.Main.start(Main.java:817) at org.eclipse.jetty.start.Main.main(Main.java:112)引起:java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.set(XmlConfiguration.java:479) at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.configure(XmlConfiguration.java:411) 在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.newObj(XmlConfiguration.java:815) 在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.itemValue(XmlConfiguration.java:1125) 在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.value(XmlConfiguration.java:1030) 在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.call(XmlConfiguration.java:721) at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.configure(XmlConfiguration.java:417) at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.configure(XmlConfiguration.java:354) 在org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:262) 在org.eclipse.jetty.xml.XmlConfiguration $ 1.run(XmlConfiguration.java:1243) at java.security.AccessController.doPrivileged(Native Method) 在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; at org.eclipse.jetty.setuid.SetUID.getpwnam(Native Method) at org.eclipse.jetty.setuid.SetUIDListener.setUsername(SetUIDListener.java:53) ......还有23个
这是对此错误的唯一引用:
但他们要么停止要么不显示解决方案。 我找到的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版本。
我尝试在java args(第一个try-catch块)中设置-Djetty.libsetuid.path,要么添加$ PATH变量的路径,要么设置-Djava.library.path(第二个try-catch块)或复制所以到/ lib,最后,保持原样(第三个try-catch块)。在所有情况下我都得到了相同的异常堆栈。 我不能确定Jetty是否找不到so文件或者无法加载它,因为如果我删除了对路径的所有引用(我后面描述的情况),我仍然得到相同的错误消息。 我使用Java7来运行Jetty。
修改 我将以下片段添加到我的一个webapps作为测试问题,因为如果webapp成功,我会知道问题不在于找到共享对象:
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:Native 库/lib/libsetuid.so已经加载到另一个类加载器
中
因此,我可以得出结论,至少已经加载了库。
答案 0 :(得分:0)
探索libsetuid文件(nm -D / path / to / the / so),我意识到我使用的是过时的并且与Jetty 9不兼容,这些函数被命名为mortbay:
root @ root:〜/ #nm -D libsetuid.so --size-sort |减 0000000000000010 T Java_org_mortbay_setuid_SetUID_setgid 0000000000000010 T Java_org_mortbay_setuid_SetUID_setuid 0000000000000015 T Java_org_mortbay_setuid_SetUID_setumask 0000000000000018 T throwNewJavaSecurityException 0000000000000058 T. throwNewJavaException 000000000000008e T. Java_org_mortbay_setuid_SetUID_setrlimitnofiles 00000000000000a7 T getJavaMethodId 00000000000000f5 T. Java_org_mortbay_setuid_SetUID_getrlimitnofiles 0000000000000102 T getJavaFieldInt 0000000000000111 T setJavaFieldInt 0000000000000111 T. setJavaFieldLong 0000000000000121 T setJavaFieldString 00000000000001ba T Java_org_mortbay_setuid_SetUID_getpwuid 00000000000001e5 T Java_org_mortbay_setuid_SetUID_getpwnam 000000000000027e T Java_org_mortbay_setuid_SetUID_getgrgid 000000000000029e T Java_org_mortbay_setuid_SetUID_getgrnam
现在,我正在使用已经在jetty下载中的共享对象,而不是wiki中链接的共享对象。 除此之外,查看setuid模块的代码,我决定在我的java args中使用属性-Djetty.libsetuid.path来指示lib的绝对路径,例如-Djetty.libsetuid.path = / opt /码头/ LIB / setuid.so