पथ में निष्पादन योग्य, जिसके द्वारा खोजने योग्य है, फिर भी पूरी तरह से योग्य पथ के बिना निष्पादित नहीं कर सकता है?


12

मुझे $ पीएटीएच में एक कमांड के साथ एक विचित्र प्रतीत होने वाला खोल मुद्दा मिला है, जो शेल (ksh, लिनक्स पर चल रहा है) कायरता से इनकार करने के लिए प्रकट होता है। कमांड को पूरी तरह से योग्य किए बिना, मुझे मिलता है:

#  mycommand
/bin/ksh: mycommand: not found [No such file or directory]

लेकिन फ़ाइल को किसके द्वारा पाया जा सकता है:

#  which mycommand
/home/me/mydir/admbin/mycommand

मैं $ PATH में स्पष्ट रूप से उस निर्देशिका को देख रहा हूं:

#  echo $PATH | tr : '\n' | grep adm
/home/me/mydir/admbin

उस स्थान पर निर्गमन सामान्य लगता है:

#  file /home/me/mydir/admbin/mycommand
/home/me/mydir/admbin/mycommand: setuid setgid ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped

# ls -l mycommand  
-r-sr-s--- 1 me mygroup 97892 2012-04-11 18:01 mycommand

और अगर मैं इसे पूरी तरह से योग्य पथ का उपयोग करके स्पष्ट रूप से चलाता हूं:

#  /home/me/mydir/admbin/mycommand

मैं अपेक्षित आउटपुट देख रहा हूं। कुछ यहाँ निश्चित रूप से खोल को भ्रमित कर रहा है, लेकिन मैं एक नुकसान में हूं कि यह क्या हो सकता है?

संपादित करें: यह देखना कि एक समान प्रश्न कैसा दिखता है: बाइनरी एक पथ के साथ चलने पर निष्पादित नहीं होगी। उदा> ./ प्रोग्राम काम नहीं करेगा लेकिन> प्रोग्राम ठीक काम करता है

मैंने अपने $ PATH में इस तरह के एक से अधिक कमांड के लिए भी परीक्षण किया, लेकिन केवल एक ही खोजें:

# for i in `echo $PATH | tr : '\n'` ; do test -e $i/mycommand && echo $i/mycommand ; done
/home/me/mydir/admbin/mycommand

EDIT2:

आज सुबह तक, समस्या गायब हो गई है , और मैं अब निष्पादन योग्य निष्पादित करने में सक्षम हूं।

लॉगआउट और लॉगिन करने के सुझाव को मान्य करने के बारे में सोचा जा सकता है, लेकिन मैंने कल रात बिना सफलता के किया। उस लॉगआउट / लॉग इन को 'हैश-आर' कमांड चलाने के बराबर किया जाना चाहिए जो सुझाया गया था (जो fwiw भी ksh buildin प्रतीत होता है, न कि सिर्फ एक bash बिलिन)।

कुछ जवाबों के जवाब में:

  • यह एक निष्पादन योग्य स्क्रिप्ट नहीं है (फ़ाइल कमांड आउटपुट में ELF संदर्भ देखें)।

  • मुझे नहीं लगता कि किसी स्ट्रीम ने मदद की होगी। यह पूरी तरह से योग्य निष्पादित करने के लिए आदेश देने के लिए समाप्त होता है। मुझे लगता है कि मैं वर्तमान शेल पर एक स्ट्रेस अटैचमेंट कर सकता था, लेकिन चूंकि मैं अब रिप्रो नहीं कर सकता, इसलिए यह कोशिश करने का कोई मतलब नहीं है।

  • $ PATH में कोई अर्धविराम नहीं थे। चूँकि मैं अब रिप्रोज़ नहीं कर सकता, इसलिए मैं इस सवाल को पूरे $ पैठ के साथ जोड़ नहीं सकता।

  • जैसा कि सुझाव दिया गया था, एक और शेल (यानी बैश) आजमा रहा हूं। चली गई समस्या के साथ, मुझे अब पता नहीं चलेगा कि क्या मदद मिलेगी।

मुझे यह भी सुझाव दिया गया था कि वह निर्देशिका अनुमतियों की जाँच कर रहा था। ऐसा करने से प्रत्येक निर्देशिका के लिए जो मैं देख रहा हूं:

# ls -ld $HOME $HOME/mydir $HOME/mydir/admbin
drwxr-xr-x 10 me root    4096 2012-04-12 12:20 /home/me
drwxrwsr-t 22 me mygroup 4096 2012-04-12 12:04 /home/me/mydir
drwxr-sr-x  2 me mygroup 4096 2012-04-12 12:04 /home/me/mydir/admbin

$ होम निर्देशिका स्वामित्व गड़बड़ है (रूट समूह नहीं होना चाहिए)। यह अन्य मुद्दों का कारण बन सकता है, लेकिन मैं यह नहीं देखता कि यह कैसे होता है।


2
आपकी स्क्रिप्टिंग कुंग-फू कमाल की है।
जेफ फेरलैंड

2
मुझे पता है कि यह बहुत सरल लगता है, लेकिन मुझे एक बार एक ही समस्या थी और यह एक बृहदान्त्र के बजाय एक पथ विभाजक के रूप में इस्तेमाल किया जाने वाला अर्ध-बृहदान्त्र निकला।
जॉन गार्डनियर्स

आप अपने पूरे पेट सेटिंग प्रदान कर सकते हैं?
जेसन हंटले

यह एक उत्कृष्ट लिखित प्रश्न है।
ग्वेल्डो

शेल की कैशिंग हो सकती थी?
माइकल स्लेड

जवाबों:


1

आपको संभवतः अपने $PATHउपयोग में अपने शेल के आइटम का कैश अपडेट करना होगा hash -r


$ apropos hash | grep ksh-- कुछ भी तो नहीं। आपने एक bashबिल्ट-इन के साथ उत्तर दिया है, लेकिन यह प्रश्न में शेल नहीं है।
जेफ फेरलैंड

1

इसके अलावा, ऐसे मामलों में, क्या होता है जब प्रोग्राम को गतिशील लिंकर के तर्क के रूप में इसके निष्पादन योग्य पास करके बुलाया जाता है (हो सकता है कि कुछ सिस्टम पर सेट / सेटिग करते समय ऐसा करने से मना कर दिया जाए)।

ldd (1) दोनों मामलों का आउटपुट भी प्रकट हो सकता है। एक निष्पादन योग्य फ़ाइल पर "ऐसी कोई फ़ाइल या निर्देशिका" वास्तव में इसका मतलब यह नहीं है कि निष्पादन योग्य फ़ाइल में निर्दिष्ट डायनामिक लिंकर को नहीं पाया जा सकता है (निष्पादन योग्य को # / / lib / ld-linux.what.so के अंदर एलिफिन रूप में देखें)।

इस व्यवहार ने लोगों को बेवकूफ बना दिया था जो कि libc5 युग के अंत के गवाह थे, और अब कभी-कभी मिश्रित i386 / amd64 के युग में लोगों को दो पुस्तकालय सेटों के समर्थन के विभिन्न साधनों के साथ जंगली में डुबो देते हैं।

निष्पादन योग्य बनाम $ PWD में सापेक्ष RPATH?

PS अन्य प्रश्न MacOSX से संबंधित है, जो शायद डाइल्ड का उपयोग करता है न कि लिबास द्वारा लिंक्ड लिंकर का। बहुत अलग तरह का जानवर।


0

ठीक है, मेरे पास कोई जवाब नहीं है। मैंने कुछ चीजों को साबित किया और मुझे लगता है कि मैं इसे बाद में जोड़ सकता हूं:

  • एक टेस्टफ़ाइल बनाया गया - आपकी अनुमतियाँ दिखाती हैं कि यह निर्धारित और निष्पादन योग्य है।
  • इसे nosuid के साथ एक माउंट बिंदु पर स्थापित करने की कोशिश की: अभी भी चलता है
  • Noexec के साथ एक माउंट बिंदु पर इसे स्थापित करने की कोशिश की: एक अलग त्रुटि देता है

इसलिए, सभी खातों द्वारा, मैं अभी भी भ्रमित हूं। सिर्फ अनाज के लिए और बंद मौके पर यह एक शेल से संबंधित बग है, क्या आप इसे एक अलग शेल के साथ आज़मा सकते हैं?


0

मैं अनुमान लगा रहा हूं कि आपकी स्क्रिप्ट में # के बाद एक मान्य शेल नहीं है! उदाहरण के लिए, कुछ पुराने SCO सिस्टम पर, #! / Bin / bash के साथ स्क्रिप्ट काम नहीं करती हैं क्योंकि bash वास्तव में / usr / bin / bash में रहता है। गूंगा, लेकिन हे SCO एक कारण के लिए लगभग मर चुका है, नहीं?

अपने शेल की जाँच करें और सुनिश्चित करें कि यह एक वास्तविक बाइनरी / स्क्रिप्ट को इंगित करता है।

संपादित करें: यह नहीं बताता है कि यह एक स्क्रिप्ट या एक द्विआधारी है, लेकिन यह मानते हुए कि आपका 'ls -l' आउटपुट सही है, तो आपके पास शायद 93kbyte स्क्रिप्ट नहीं है ... इसलिए यह शायद एक द्विआधारी अर्थ है मेरा जवाब है पूरी तरह से गलत।

क्या आपने लॉग आउट करके वापस अंदर जाने की कोशिश की है? मुझे पता है कि अगर मैं एक बाइनरी का उपयोग करता हूं / usr / bin तो स्रोत से / usr / स्थानीय / बिन संस्करण स्थापित करें, सिस्टम अभी भी मूल एक को निष्पादित करने की कोशिश करता है जब तक कि मैं लॉग आउट और वापस अंदर नहीं जाता।


यह एक निष्पादन योग्य था और स्क्रिप्ट नहीं (प्रश्न में फ़ाइल से ईएलएफ जानकारी देखें)। हाँ, मैं बाहर लॉग इन और।
Peeter Joot

0

मेरा अनुमान है:

  • आपका एक उपनाम था mycommand। उदाहरण के लिए:

    alias mycommand=something
    
  • आपका एक फंक्शन था जिसका नाम है mycommand। उदाहरण के लिए:

    mycommand() { something; }
    

अगली बार जब आपको यह समस्या हो, तो यह command -V mycommandदेखने का प्रयास करें कि शेल किस प्रकार का आदेश मानता mycommandहै।


उनमें से कोई भी इस कमांड के लिए मामला नहीं था।
पेटर जूट

0

कोई जवाब नहीं, बस विचारों का एक गुच्छा:

  1. जांचें कि क्या फ़ाइलनाम में व्हॉट्सएप है; टैब-पूर्णता का उपयोग करते समय इसे चुपचाप अनदेखा कर दिया जाता है और एक पैरामीटर के रूप में उपयोग किया जाता है।
  2. निर्देशिका में एक और स्क्रिप्ट / कार्यक्रम का प्रयास करें।
  3. स्क्रिप्ट को निष्पादित करने की कोशिश कर रहा है और जहां यह टूट जाता है देखने की कोशिश कर रहा है।

0

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

जिन लक्षणों का मैंने सामना किया, वे निम्नलिखित थे। / My / home निर्देशिका में एक स्क्रिप्ट (myscript.pl) है। अब इसे चलाने की कोशिश कर रहा है:

> /my/home/myscript.pl
myscript.pl:  permission denied.

फ़ाइल की सत्यापित अनुमति (निष्पादन ध्वज सेट है)। सत्यापित $ PATH (हालांकि एक मुद्दा नहीं होना चाहिए)।

तो फिर मैं कोशिश करता हूं (स्क्रिप्ट पर अमल करने के बाद झंडा फहराया जाता है):

> cd /my/home/
> ./myscript.pl:  permission denied.

हम्मम ... तो शायद स्क्रिप्ट सही स्क्रिप्टिंग भाषा (इस मामले में पर्ल) को नहीं कह रही है। स्क्रिप्ट के शीर्ष में सही जादू है:

#!/usr/bin/perl

और वास्तव में / usr / बिन / पर्ल मौजूद है और काम करता है। तो निम्न कॉल सही ढंग से काम करता है।

/usr/bin/perl myscript.pl

टैब ऑटो-पूर्ण फ़ाइल नहीं दिखाएगा (और न tcshही में bash)।

यह वास्तव में मुझे फेंक दिया। फिर याद आया कि कुछ महीने पहले मेरी हार्ड डिस्क क्रैश हो गई थी, और मेरी लैब में युवा सिस्टम एडमिनिस्ट्रेटर ने सिस्टम को फिर से इंस्टॉल किया। सोचा था कि उसने विभाजन पर अनुमतियों को खराब कर दिया है। और वास्तव में, में /etc/fstab, निष्पादन अनुमति गायब थी!

/dev/sda1    /my     /ext4      rw,user

के बजाय

/dev/sda1    /my     /ext4      rw,user,exec

इसे बदलकर /etc/fstabऔर रीमाउंट करके फिक्स्ड करें :

mount -v -o remount /my

इससे समस्या पूरी तरह से हल हो गई। मेरा अनुमान है कि मूल पोस्टर की समस्या के साथ भी ऐसा ही कुछ हुआ होगा, सिवाय इसके कि अनुमति मुद्दा रुक-रुक कर था (उदाहरण के लिए, एक अस्थायी परिवर्तन था जो रिबूट के साथ हल हो सकता था, अगर कोई जगह ले ली गई हो)।


-1

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

नेस्टेड स्क्रिप्ट में कमांड से ठीक पहले, मैंने कमांड प्रिंट किया, उदाहरण के लिए इको $ (जो mycommand)

mycommand: / home / me / bin / mycommand

फिर मैं इसे मूल स्क्रिप्ट से निष्पादित करने का प्रयास करूंगा:

/ home / me / bin / some_parent_script [72]: mycommand: नहीं मिला [ऐसी कोई फ़ाइल या निर्देशिका] नहीं

प्रश्नकर्ता की तरह, मैं समस्या के स्रोत का निदान करने में असमर्थ था। मेरा पेट सही दिख रहा था, जो कि सक्षम था, और हैश ने मायकॉम की किसी भी पूर्व प्रविष्टि को प्रकट नहीं किया था। अगले दिन जब मैंने लॉगिन किया, तो सब कुछ जादुई तरीके से फिर से काम किया। अब, मैं यहां ध्यान दूंगा कि एक ज्ञात प्रणाली समस्या थी जो इस समस्या को देखने से ठीक पहले हुई थी जहां एक माउंट को हटा दिया गया था। शायद यह एक सुराग है?

यदि मेरे पास लॉग फ़ाइल के बाद लॉग फ़ाइल नहीं होती है, तो यह प्रदर्शित होता है कि मुझे विश्वास नहीं होता कि यह संभव हुआ है! प्रश्नकर्ता के लिए धन्यवाद, मैं अब पागल नहीं लग रहा हूँ!

PS मुझे नहीं लगता कि user226160 को रिपोर्टर के रूप में एक ही समस्या थी, लेकिन यह संबंधित लगता है, और माउंट सिद्धांत को उधार देता है।

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