2012-04-23 14 views
12

मैं एक फ़ोल्डर ट्री में सभी फ़ाइलों के लिए विहित रास्तों को हल करने की कोशिश कर रहा हूँ पर सिमलिंक का समाधान हो जाएगा नहीं है, लेकिन किसी कारण से यह उनके समाधान नहीं होगा (और रुक-रुक कर JVM सुरक्षा कोड के भीतर सिमलिंक ठीक से हल होगा फ़ाइल अनुमति और सुरक्षा त्रुटि का कारण बनता है)।जावा रुक-रुक कर लिनक्स

पर्यावरण:

$ java -version 
java version "1.6.0_23" 
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

प्रणाली में एक जाना जाता सिमलिंक /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 /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 

एक और परीक्षण, निम्नलिखित कोड का उपयोग कर, कभी कभी सच अनुमति जांच करने के लिए वापस आ जाएगी, लेकिन कभी कभी अवास्तविक लौटाते हैं:

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 

लेकिन जब

(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 
0123: डीबगिंग, अगर मैं लक्ष्य फ़ाइल पर FilePermission के सृजन के माध्यम कदम, आंतरिक पथ सिमलिंक करने के लिए उत्पादन परिणाम हल हो गई है, और समस्या

कि एप्लिकेशन जिसमें अनुमति वास्तव में जाँच जगह लेता है के संदर्भ में, सिमलिंक हमेशा FilePermission वस्तु द्वारा हल हो गई है है, लेकिन() file.getCanonicalPath को अपने खुद के कॉल से कभी नहीं के रूप में ऊपर का प्रदर्शन किया।

क्या यह किसी के लिए समझ में आता है?

+1

आप एक बग रिपोर्ट दर्ज करना चाहेंगे; मैं अपने उबंटू 11.04 सिस्टम पर ओपनजेडके या सूरज जेडीके के साथ शुरुआती 'getCanonicalPath() 'समस्या का पुनरुत्पादन नहीं कर सकता। – sarnold

+0

सरनोल्ड, क्या आप सटीक ओपनजेडीके संस्करण का उपयोग कर रहे हैं? आश्चर्य है कि शायद यह विशिष्ट रिलीज में एक मुद्दा है। इसके अलावा, मैंने अभी पाया है कि अगर मैं या तो -Dsun.io.useCanonCaches = false या -Dsun.io.useCanonPrefixCache = false सेट करता हूं तो मैं 100% समय को हल करने के लिए कैननिकल पथ प्राप्त कर सकता हूं लेकिन यह अजीब लगता है। – Ray

+0

मुझे खेद है कि मैंने संस्करण संख्या शामिल नहीं की थी; 'जावा-वर्जन' रिपोर्ट 'ओपनजेडीके रनटाइम एनवायरनमेंट (आईसीएसटीए 661010) (6 बी 22-1.10.6-0ubuntu1) 'ओपनजेडीके 64-बिट सर्वर वीएम (बिल्ड 20.0-बी 11, मिश्रित मोड)'। – sarnold

उत्तर

4

मेरा एक सहयोगी OpenJDK 6u23 पर इस मुद्दे की पुष्टि की है, लेकिन किसी भी पूर्व या निम्न संस्करणों पर नहीं।इसका अर्थ है कि, के बाद से इस मुद्दे को

ए) एक काम के आसपास प्रणाली संपत्ति

-Dsun.io.useCanonCaches=false 
OR 
-Dsun.io.useCanonPrefixCache=false 

बी) के रूप में है) बाद में निर्माण (U24 में हल करने की

वहाँ प्रकट होता दिखाई देता है किसी भी गहरी खुदाई करने के लिए थोड़ा प्रेरणा होने के लिए।

0

यूनिक्स में एक सिम्लिंक अपनी "अनुमति" फ़ाइल है, इसकी अपनी अनुमतियों के साथ।

तथ्य यह है कि आपके पास प्रतीकात्मक लिंक पर पढ़ने की अनुमति है, इसका मतलब यह नहीं है कि आपके पास फ़ाइल से जुड़ी फाइल होगी।

मेरे यहाँ अनुमान है कि आप एक उपयोगकर्ता कि सिमलिंक नहीं लेकिन वास्तविक फ़ाइल पढ़ सकते हैं के रूप में अपने कार्यक्रम चलाए जा रहे है।

जब डिबग मोड में प्रवेश आप कुछ विधि है कि यह वास्तविक फ़ाइल को हल कर रही FilePermission वस्तु की आंतरिक स्थिति को बदलने के लिए और इस तरह आप "गलत" लौटने के लिए कॉल ट्रिगर।

जब आपको "सत्य" मिलता है तो यह आपको बता रहा है कि आप प्रतीकात्मक लिंक पढ़ सकते हैं।

अपनी जगह में, मैं इस फ़ाइल पर अनुमति की जांच करेंगे: - /usr/share/java/gnome-java-bridge.jar

और दो निर्देशिकाओं करने के लिए: -/usr/share -/usr/share/जावा

+0

फ़ाइल और सिम्लिंक दोनों में "अन्य" के लिए "पढ़ा गया" है, इसलिए यह पदानुक्रम में निर्देशिकाओं के रूप में समस्या नहीं है। – Ray

संबंधित मुद्दे