java将间歇性地不解析Linux上的符号链接
我试图解析文件夹树中所有文件的规范路径,但由于某些原因,它无法解析它们(JVM安全代码会间歇性地在FilePermission中正确解析符号链接,并导致安全错误) 环境: 系统中已知的符号链接是/usr/share/java/gnome-java-bridge.jar:java将间歇性地不解析Linux上的符号链接,java,linux,permissions,openjdk,Java,Linux,Permissions,Openjdk,我试图解析文件夹树中所有文件的规范路径,但由于某些原因,它无法解析它们(JVM安全代码会间歇性地在FilePermission中正确解析符号链接,并导致安全错误) 环境: 系统中已知的符号链接是/usr/share/java/gnome-java-bridge.jar: $ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /
$ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar -> ../../../../../../share/java/gnome-java-bridge.jar
以下代码应解析此已知符号链接:
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
System.out.println(symlinkedFile.getAbsolutePath());
System.out.println(symlinkedFile.getCanonicalPath());
但产生:
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
使用以下代码的进一步测试有时会为权限检查返回true,但有时会返回false:
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
FilePermission recursivePermission = new FilePermission(
symlinkedFile.getParentFile().getParent() + "/-", "read");
FilePermission filePermission = new FilePermission(
symlinkedFile.getAbsolutePath(), "read");
System.out.println(recursivePermission);
System.out.println(filePermission);
System.out.println(
"Can read symlink: " + recursivePermission.implies(filePermission));
典型的结果是:
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: true
但在调试时,如果我在目标文件上逐步创建FilePermission,则会在内部将路径解析为符号链接,输出结果为:
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: false
问题在于,在实际进行权限检查的应用程序上下文中,符号链接始终由FilePermission对象解决,但决不由我自己调用file.getCanonicalPath()解决,如上所示
这对任何人都有意义吗?在Unix中,符号链接是一个“特殊”文件,具有自己的权限
您拥有符号链接的读取权限这一事实并不意味着您将拥有链接文件的读取权限
我的猜测是,您正在以可以读取符号链接但不能读取实际文件的用户身份运行程序
进入调试模式时,会触发对某个方法的调用,该方法会更改FilePermission对象的内部状态,使其解析为实际文件,从而返回“false”
当你得到“真”时,它只是告诉你你可以阅读符号链接
在您的位置,我将检查此文件的权限:
-/usr/share/java/gnome-java-bridge.jar
和两个目录:
-/usr/share
-/usr/share/java我的一位同事在OpenJDK 6u23上确认了这个问题,但没有在任何以前或以后的版本上确认。话虽如此,但问题已经解决 A) 以系统属性的形式进行的变通
-Dsun.io.useCanonCaches=false
OR
-Dsun.io.useCanonPrefixCache=false
B) 似乎已在以后的版本(u24)中解决
似乎没有什么动机去深入挖掘。您可能希望提交一份bug报告;我无法在我的Ubuntu11.04系统上重现openjdk或sun jdk的初始
getCanonicalPath()
问题。sarnold,您使用的是确切的openjdk版本吗?不知道这是否是特定版本中的一个问题。此外,我刚刚发现,如果我设置-Dsun.io.useCanonCaches=false或-Dsun.io.useCanonPrefixCache=false,我可以在100%的时间内解析规范路径,但这似乎很奇怪<代码>java-版本报告OpenJDK运行时环境(IcedTea6 1.10.6)(6b22-1.10.6-0ubuntu1)OpenJDK 64位服务器虚拟机(构建20.0-b11,混合模式)
。不确定是否会产生差异,但请尝试以root用户身份运行应用程序。一个模糊的远景:如果修改符号链接以指向“绝对”路径,是否会产生任何差异?(即/usr/share/java/gnome java bridge.jar
)文件和符号链接都有“读取”表示“其他”,因此这似乎不是问题所在,层次结构中的目录也是如此。
-Dsun.io.useCanonCaches=false
OR
-Dsun.io.useCanonPrefixCache=false