क्यों खोज आदेश को / रन / में उड़ा देता है?


13

मैं द्वारा दिए गए के रूप में अजगर संस्करण की जाँच करने के लिए निम्न आदेश का इस्तेमाल किया इस जवाब । यह नीचे दिखाई गई एक त्रुटि को छोड़कर काम करता है। क्या कोई समझा सकता है क्यों?

$ sudo find / -type f -executable -iname 'python*' -exec file -i '{}' \; \
    | awk -F: '/x-executable; charset=binary/ {print $1}' \
    | xargs readlink -f | sort -u | xargs -I % sh -c 'echo -n "%: "; % -V'

त्रुटि:

find: ‘/run/user/1000/gvfs’: Permission denied

2
python --versionऔर python3 --versionसक्रिय संस्करण दिखाने के लिए। हम सभी के पास एक 2.x संस्करण और एक 3.x संस्करण है;)
रिनजविंड

6
और त्रुटि सामान्य है और कमांड के साथ कोई समस्या नहीं है। /run/"खोज" में शामिल नहीं होना चाहिए। gvfsआपके उपयोगकर्ता के स्वामित्व में नहीं है।
रिनविंड

1
आप pythonकंसोल में भी टाइप कर सकते हैं और टैब की कुंजी को दो बार दबा सकते हैं , यह आपके रास्ते में हर निष्पादन योग्य को दिखाएगा python
टिमो

7
अच्छा दु: ख, लोग। मैं इस सवाल का काफी हद तक संपादन कर रहा हूं क्योंकि कुछ लोगों ने इसे पहले पैराग्राफ में बनाने का प्रबंधन नहीं किया था। ओपी जानता है कि किस संस्करण को खोजना है, सवाल यह है कि यह कमांड (जो पायथन के सभी संस्करणों को ढूंढता है ) एक विशिष्ट त्रुटि को चकित कर रहा है। यदि आप python -Vविकल्पों और विकल्पों के बारे में पोस्ट करना चाहते हैं , तो कृपया इसे एक प्रश्न पर ले जाएं, जो वास्तव में उस जानकारी की मांग कर रहा है
ओली

1
प्रश्न में कमांड चलाना एक बुरा विचार है, यह आपके सिस्टम पर कोई भी फाइल ढूंढेगा जिसका नाम अजगर से शुरू होता है और इसे रूट के रूप में निष्पादित करता है । यदि आपके उपयोगकर्ताओं को यह पता चलता है कि आप इस कमांड का उपयोग करते हैं, तो आपने उन्हें एक तुच्छ मूल-शोषण सौंप दिया।
पीटर ग्रीन

जवाबों:


20

अनुमतियाँ:

$ stat -c %a /run/user/1000/gvfs
500

तो केवल स्वामी ने अनुमति निष्पादित की है (जो निर्देशिकाओं को खोजने की अनुमति देता है)। लेकिन, आपने उपयोग किया sudoऔर रूट के पास सभी संभव अनुमति हैं, है ना? वास्तव में आपको अपवाद मिला:

इस उत्तर से गाइल्स यूनिक्स और लिनक्स एसई पर बताता है कि क्यों अनुमति जड़ है कि निर्देशिका, जो फ्यूज के लिए एक माउंटप्वाइंट है के लिए इनकार किया है:

FUSE फाइल सिस्टम के साथ विश्वास की सीमाओं को प्रबंधित करना मुश्किल है, क्योंकि पारंपरिक सिस्टम के लिए कर्नेल कोड के विपरीत फाइलसिस्टम चालक एक अप्रभावित उपयोगकर्ता के रूप में चल रहा है। डिफ़ॉल्ट रूप से जटिलताओं से बचने के लिए, FUSE फाइल सिस्टम केवल ड्राइवर प्रक्रिया चलाने वाले उपयोगकर्ता के लिए ही सुलभ है। यहां तक ​​कि रूट भी इस प्रतिबंध को दरकिनार नहीं करता है।

यदि आप findबिना sudoअपने स्वयं के उपयोगकर्ता (यूआईडी 1000 के रूप में) कमांड चलाते हैं, तो आपको वह त्रुटि नहीं मिलेगी, क्योंकि आप निर्देशिका के मालिक हैं, लेकिन आपको इसके बजाय अन्य अनुमति त्रुटियां प्राप्त होंगी, इसलिए, sudoगिल्स की सलाह का उपयोग करें और लें:

यदि आप केवल स्थानीय फाइल सिस्टम पर एक फ़ाइल खोज रहे हैं, तो खोजने के लिए -xdev पास करें।


अजगर संस्करणों की जांच करने के लिए सबसे आसान तरीका:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+

मेरे पास रूट को छोड़कर केवल एक ही उपयोगकर्ता है फिर आप इसे खुद करने की उम्मीद किससे करते हैं?
अब्दुल कय्यूम

1
यह आप, यूआईडी 1000 है। आप cdउस निर्देशिका को अपने सामान्य उपयोगकर्ता के रूप में देख सकते हैं , लेकिन जड़ के रूप में नहीं। यदि आप findबिना दौड़ें sudoउस त्रुटि को नहीं देखेंगे (लेकिन आपको पाठ्यक्रम की अन्य अनुमति त्रुटियां मिलेंगी)
Zanna

2
@abdulqayyum क्या आप सुनिश्चित हैं? डिफ़ॉल्ट रूप से ubuntu के पास बहुत से उपयोगकर्ता हैं जो विभिन्न डेमॉन प्रक्रियाओं से जुड़े हैं। तो हाँ, वे लॉगिन नहीं कर सकते हैं और उनके पास एक घर निर्देशिका नहीं है, लेकिन वे मौजूद हैं और वे फ़ाइलों और निर्देशिकाओं के मालिक हो सकते हैं ...
बाकूरी

7

आपके पास अजगर के किस संस्करण को खोजने के कई तरीके हैं। यहाँ दो तरीके हैं जिनसे आपको पायथन 2 और पायथन 3 संस्करण मिलेंगे:

अजगर विशिष्ट

पहले सिर्फ रन pythonऔर python3विकल्प के साथ--version

$ python --version
Python 2.7.12
$ python3 --version
Python 3.5.2

यह अजगर के लिए विशिष्ट है, लेकिन बहुत सारे अन्य प्रोग्राम एक समान विधि का उपयोग करते हैं।

किसी भी पैकेज / कार्यक्रम के लिए सामान्य

एक अधिक सामान्य विधि यह देखना है कि पैकेज क्या स्थापित है। dpkg -lआपके सभी पैकेजों को सूचीबद्ध करेगा, लेकिन आप निर्दिष्ट कर सकते हैं कि आप किन पैकेजों की तलाश कर रहे हैं। केवल अजगर और अजगर 3 के लिए निम्नलिखित का उपयोग करें:

$ dpkg -l 'python'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python                2.7.11-1        amd64           interactive high-level object-oriented language 
$ dpkg -l 'python3'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python3               3.5.1-3         amd64           interactive high-level object-oriented language 

एक अतिरिक्त शीर्षक के रूप में। यदि आप उन सभी पैकेजों को ढूंढना चाहते हैं जिनमें एक नाम है python, जिसके साथ आप वाइल्डकार्ड वर्ण का उपयोग कर सकते हैं *:

$ dpkg -l 'python*'

जो पैकेजों के साथ बहुत सारी लाइनें प्रिंट करेगा।


अच्छा जवाब लेकिन ऊपर की स्क्रिप्ट काम करती है। मैं केवल अनुमति से इनकार करने के बारे में चिंतित था
पेटी कय्यूम

हम में से ज्यादातर सिर्फ एक अस्थायी फ़ाइल को पुनर्निर्देशित करते हैं। बहुत सारे स्कैन प्रकार के संचालन के लिए होता है।
मैकेंज़्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.