मैं अनुमतियों को निष्पादित किए बिना किसी फ़ाइल को कैसे निष्पादित कर सकता हूं?


11

मैं इसके लिए अपने आप को अनुमति (साथ chmod u+x) दिए बिना किसी फ़ाइल को कैसे निष्पादित कर सकता हूं ?

अगर मैं 'एक्ज़क्यूटिंग फ़ाइल को प्रोग्राम के रूप में अनुमति देता हूँ' चेकमार्क टिक करता हूँ, तो चेकमार्क तुरंत हटा दिया जाता है।


सदृश: बिना चामर के कैसे / usr / bin / chmod? यूनिक्स में
kenorb

1
फ़ाइल अनुमतियों के पूरे बिंदु नहीं है ताकि यह DOESN'T न हो? : डी
गैलिशियन्

जवाबों:


14

फ़ाइल स्वामित्व जांचें

कृपया आगे कुछ भी करने से पहले (जब तक आप सुनिश्चित न हों कि आप फ़ाइल के स्वामी हैं)।

जाँच करें और सुनिश्चित करें कि आप उस फ़ाइल के मालिक हैं जिसे आप निम्नलिखित विधियों में से किसी एक के साथ निष्पादित करने का प्रयास कर रहे हैं।

चित्रात्मक

  1. फ़ाइल पर राइट क्लिक करें।
  2. 'गुण' पर क्लिक करें।
  3. 'अनुमतियाँ' टैब पर क्लिक करें।
  4. सुनिश्चित करें कि 'स्वामी' फ़ील्ड आपका उपयोगकर्ता नाम कहती है। यदि यह नीचे "फ़ाइल स्वामित्व बदलें" नहीं देखता है

कमांड लाइन

  1. इस आदेश को किसी टर्मिनल में निष्पादित करें

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. यदि यह " You don't own the file" प्रिंट करता है , तो नीचे "फ़ाइल स्वामित्व बदलें" देखें।

फ़ाइल स्वामित्व बदलें

इस आदेश को किसी टर्मिनल में निष्पादित करें

sudo chown $USER:$(id -gn $USER) "/path/to/file"

निष्पादन योग्य फ़ाइलें

एक जवाब मैं एक से मिला टिप्पणी द्वारा Lekensteyn एक पर जवाब एक के लिए प्रश्न के बारे में chmodNTFS विभाजन जो मुझे लगता है कि उसके अपने सवाल-जवाब, Lekensteyn के लिए पूरा श्रेय पर।

निष्पादन योग्य फ़ाइलों के लिए इस कमांड का उपयोग करें ( /path/to/executableसही पथ के साथ प्रतिस्थापन ):

  • 64 बिट निष्पादन योग्य फाइलें:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • 32 बिट निष्पादन योग्य फाइलें:

    /lib/ld-linux.so.2 /path/to/executable
    

यदि उपरोक्त काम नहीं करता है (या फ़ाइल नहीं मिली त्रुटियों को उठाता है), तो उपरोक्त कमांड से पहले इसका उपयोग करने का प्रयास करें

cd "$(dirname /path/to/executable)"

उपरोक्त सभी कमांड पाठ आधारित स्क्रिप्ट (बाश, पायथन, पर्ल, आदि) के लिए काम नहीं करेंगे , नीचे देखें।

जांचें कि क्या कोई प्रोग्राम 64 या 32 बिट का है

इस कमांड का उपयोग यह पता लगाने के लिए करें कि एक निष्पादन योग्य 32 ( x86) या 64 ( x86-64) बिट है

objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'

अगर यह कहता है i386:x86-64, तो यह 64 बिट है। यदि यह i386केवल कहता है , तो यह 32 बिट है।


स्क्रिप्ट

पाठ आधारित स्क्रिप्ट (बाश, पायथन, पर्ल, आदि) के लिए, आपको #!फ़ाइल में पहली पंक्ति में निर्दिष्ट कमांड का उपयोग करना चाहिए ।

उदाहरण के लिए, यदि फ़ाइल की पहली पंक्ति है

#!/usr/bin/env python3

फिर इन कमांड को टर्मिनल में चलाएं ( /path/to/fileसही रास्ते से प्रतिस्थापित )

cd "$(dirname /path/to/file)"       # Not strictly necessary, see section below

# Replace '/usr/bin/env python3' with the first line without the front #!
/usr/bin/env python3 /path/to/file  # Use './file' if you want

जावा .jarफाइलें

जावा निष्पादन योग्य जार के लिए, आप बस इन कमांड का उपयोग कर सकते हैं ( /path/to/jarसही पथ के साथ प्रतिस्थापन ):

cd "$(dirname /path/to/jar)"   # Not strictly necessary, see section below
java -jar /path/to/jar

जब आपको जरूरत नहीं है cd "$(dirname /path/to/file)"

ये संभव परिस्थितियां हैं जहां आपको cd "$(dirname /path/to/file)"किसी भी विधि के साथ कार्यक्रम चलाने से पहले उपयोग करने की आवश्यकता नहीं है: यदि कम से कम एक सच है, तो आपको cdपहले की आवश्यकता नहीं होगी ।

  • कार्यक्रम स्वयं कोई फ़ाइल संचालन नहीं करता है (उदाहरण: यह केवल उपयोग करता है apt-get)
  • कार्यक्रम का उपयोग करता है cd(या समतुल्य) किसी भी फाइल संचालन करने से पहले एक पूर्ण पथ के लिए बदलने के लिए (उदाहरण: cd "$(dirname "$0")")
  • कार्यक्रम किसी भी रिश्तेदार पथ ( ./कोई स्लैश के साथ शुरू या शुरू होने वाले पथ) का संदर्भ नहीं देता है

यदि अनिश्चित है, cd "$(dirname "$0")"तो स्क्रिप्ट के शीर्ष पर (या समतुल्य) जोड़ें (यदि लागू हो) या cd "$(dirname /path/to/file)"वैसे भी उपयोग करें ।


1
जो कोई भी इसे स्क्रिप्ट करना चाहता है और इसे सभी संभावनाओं को कवर करने के लिए बनाता है (यदि आप एमएस फाइलसिस्टम का उपयोग बहुत करते हैं) में आपका स्वागत है। मैं इसे स्वयं कर सकता हूं, लेकिन इस पर भरोसा नहीं करता। (+1 यह टिप्पणी करें यदि आप यह चाहते हैं, तो पर्याप्त समर्थन और मैं यह कर सकता हूं)
किरी

0

यदि यह एक शेल स्क्रिप्ट है, तो आप इसे किसी अन्य शेल स्क्रिप्ट से "स्रोत" कर सकते हैं, अर्थात:

#!/bin/bash
# This script runs another script indirectly, by sucking in its contents and evaluating inline:

source /path/to/script/which/lost/its/exec/flag "$@"

यदि आवश्यक हो तो "$ @" कमांड लाइन मापदंडों को जोड़ता है।

होने के बाद, यह शायद अंतर्निहित समस्या का सबसे अच्छा समाधान नहीं है, लेकिन हम विकल्प की पेशकश करने के लिए उस समस्या के बारे में पर्याप्त नहीं जानते हैं।


मैं यह नहीं देखता कि यह विशेष रूप से किस तरह से अलग हैbash script $@
kiri

यह ऑपरेशन में मौलिक रूप से भिन्न नहीं है। सबसे अधिक संभावना है कि मुझे समझ नहीं आ रहा है कि आप किस समस्या को हल करने की कोशिश कर रहे हैं - मैंने मान लिया कि आप एक स्क्रिप्ट को निष्पादित करने के लिए एक बिंदु और एक क्लिक तरीका चाहते थे (जो भी कारण हो) निष्पादन योग्य नहीं है। "एक है कि निष्पादन योग्य है और यह दूसरे स्रोत है" उस समस्या का एक समाधान है। अगर वह गलत समस्या है ... अच्छी तरह से :)
Stabledog
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.