अनुमति से वंचित हो रही .out फ़ाइलों को निष्पादित नहीं किया जा सकता


11

मैंने एक C ++ प्रोग्राम लिखा है और इसे a.out फ़ाइल बनाने के लिए अनुपालन किया है। हालांकि, जब भी मैं इसे चलाने की कोशिश करता हूं, मुझे परमिशन डेनिड मिल जाता है। मैंने पढ़ा कि हम sudo का उपयोग कर सकते हैं, लेकिन मैं इसे काम करने के लिए नहीं पा सकता हूँ। मैं कुछ का उपयोग करता हूं, sudo "./a.out" लेकिन वह भी काम नहीं करता है।

संपादित करें :

यह संदेश मुझे तब मिलता है जब मैं कोशिश करता हूं "./a.out"।

bash: ./a.out: Permission denied

Ls -l a.out का आउटपुट क्या है ? फ़ाइल a.out का आउटपुट क्या है ? USB मेमोरी स्टिक / हार्डडिस्क पर निष्पादन योग्य है?
JRT

इसके हार्डडिस्क पर। संकलन प्रक्रिया के तुरंत बाद इसकी एक ही फाइल बनाई गई। मैंने कोई अन्य पैरामीटर सेट नहीं किया है।
शमीम हाफिज

-rw ------- 1 शमीमहिफ़ शमीमहफ़िज़ 7721 2011-05-22 23:30 a.out क्या ls -l a.out का उत्पादन है
शमीम हाफ़िज़

तो ls -l a.out के आउटपुट के आधार पर यह एक अनुमतियों की समस्या है। यदि आप करते हैं chmod + x a.out तो कोशिश ./a.out निष्पादित करता है? Umask का आउटपुट क्या है ?
JRT

@JRT: यह निष्पादित नहीं करता है। "Chmod + x a.out" करने से कोई संदेश नहीं मिलता है, लेकिन ऐसा लगता है कि इसका कोई प्रभाव नहीं है। "Ls -l a.out" को फिर से आज भी एक ही बात दर्शाता है।
शमीम हाफिज

जवाबों:


19

आमतौर पर, g++बनाई गई फ़ाइल को निष्पादित अनुमति देता है। यदि आप -oविकल्प पास नहीं करते हैं , तो फ़ाइल का नाम दिया जाएगा a.out

दो संभावित कारणों से आपकी फ़ाइल में उनके समाधान के साथ निष्पादन बिट सेट नहीं है:

  1. Umask मूल्य 0133 की तरह एक मान पर सेट है, जिससे स्थापित होने से निष्पादित बिट को रोकने। समाधान: अनुमतियाँ स्पष्ट रूप से सेट करें:

    chmod 755 a.out
    
  2. आप जिस फाइलसिस्टम पर काम कर रहे हैं, वह लिनक्स की अनुमति का समर्थन नहीं करता है। यदि आप FAT32- स्वरूपित फ़्लैश ड्राइव पर फ़ाइलें डाल रहे हैं तो यह मामला हो सकता है। समाधान: या तो फ़ाइलों का बैकअप लें और इसे ext2 में फ़ॉर्मेट करें या ड्राइव को ( fmask=0022या umask=0022छोड़ कर fmask) माउंट करें । देखें वसा के लिए माउंट विकल्पों पर खंड माउंट के मैनुअल पृष्ठ अधिक जानकारी के लिए।

बैश स्क्रिप्ट के लिए जिसमें एक्ज़ीक्यूट बिट सेट नहीं है, आप चला सकते हैं bash file.sh। निष्पादन योग्य सामग्री (संकलित फ़ाइलें और एक शेबंग लाइन #!/path/to/interpreterसेट के साथ फ़ाइलें) के साथ ऐसी सुविधा मौजूद है । निष्पादित बिट सेट के बिना फ़ाइलों को निष्पादित करने के लिए, इस तरह के कार्यक्रम को चलाने के लिए विशेष फ़ाइल /lib/ld-linux.so.2(या /lib/ld-linux-x86-64.so.264-बिट अनुप्रयोगों के लिए) का उपयोग करें:

/lib/ld-linux-x86-64.so.2 a.out

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

1
आपने एक वुबी इंस्टॉलेशन किया है ( C:\Ubuntuबनाया गया था)। यह तब तक समस्या नहीं होनी चाहिए जब तक आप "C:" पर फाइल नहीं डाल रहे हैं और न ही आपके Ubuntu इंस्टालेशन पर। यदि आप विंडोज का उपयोग नहीं कर रहे हैं, या डिस्क स्थान बहुत है, तो मैं एक समर्पित विभाजन पर उबंटू स्थापित करने का सुझाव देता हूं। और फिर, NTFS / FAT32 लिनक्स अनुमतियों का समर्थन नहीं करता है, तो आप चला सकते हैं sudo chown user file, chmod 755 file, यह काम नहीं करेगा। आपको वास्तव में इसके लिए एक EXT फाइल सिस्टम की आवश्यकता है।
लेकेनस्टाइन

3
एक ही कहानी, विंडोज फाइलसिस्टम में से कोई भी लिनक्स फ़ाइल अनुमतियों का समर्थन नहीं करता है। आपको फ़ाइलों को EXT स्वरूपित फ़ाइल सिस्टम पर रखना चाहिए।
लेकेन्स्टाइन

1
तो बस एक फ़ोल्डर पर काम करना जो उबंटू के अंतर्गत आता है उसे सही करना चाहिए? मेरा मतलब है, मुझे उन फ़ोल्डरों का उपयोग नहीं करना चाहिए जो Ubuntus फ़ाइल सिस्टम संरचना का हिस्सा नहीं हैं?
शमीम हाफिज

3
बिल्कुल, बस में रहो ~, मैं ~/projectsअपनी सारी परियोजनाएँ बनाता और डालता हूँ, तुम वही काम कर सकते थे।
लेकेन्स्टाइन

5

.आउट एक असामान्य विस्तार है। आमतौर पर यह सामान्य रूप से "ट्रेस आउटपुट" फ़ाइल को दर्शाता है।

अपने सिंटैक्स की जाँच करें जिसे आप संकलित करने के लिए उपयोग कर रहे हैं

जैसे

gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename

या हो सकता है

g++ myfile.cpp -lm -o outputfilename

आपको यह देखने के लिए जांच करनी चाहिए कि क्या निष्पादन योग्य बिट फ़ाइल पर सेट है

ls -l a.out

या आप केवल निष्पादन योग्य बिट को बाध्य कर सकते हैं

chmod +x a.out

फिर आप अपनी फ़ाइल चला सकते हैं

./a.out

या केवल

a.out

आपको शायद यह भी जांचना चाहिए कि आउटपुट फ़ाइल को बाइनरी के रूप में सही तरीके से लिखा गया है

अर्थात

file a.out

यह रिपोर्ट करेगा कि फ़ाइल क्या प्रारूप है - या तो एक स्क्रिप्ट या एक बाइनरी

आपको शायद ही कभी रूट के रूप में निष्पादित करने की आवश्यकता है जब तक कि आपने प्रतिबंधित नहीं किया है जो निष्पादन योग्य चलाने में सक्षम होना चाहिए।

यदि आपने रूट के रूप में संकलित किया है (उदाहरण के लिए सुडो मेक), या एक मेकफाइल है जिसने निष्पादन योग्य को रूट के रूप में स्थापित किया है, तो क्या मैं आपको सुझाव दे सकता हूं कि उपयोगकर्ता लॉग इन के रूप में अनुमति प्राप्त कर सकता है

अर्थात

sudo chown fred:fred a.out

यानी आपके उपयोगकर्ता आईडी के साथ "फ़्रेड" को प्रतिस्थापित करता है।


जानकारी के लिए धन्यवाद। मैं वास्तव में एकमात्र उपयोगकर्ता के रूप में लॉग इन हूं, और मुझे लगता है कि मैं मुख्य उपयोगकर्ता हूं। मुझे बिल्कुल यकीन नहीं है, मुझे वैसे भी प्रशासनिक प्रमाणीकरण का उपयोग करने की आवश्यकता क्यों है। मैं इस विकल्प को कैसे निकाल पाऊंगा ताकि मैं हमेशा फाइलें चला सकूं।
शमीम हाफिज

अद्यतन - स्पष्ट रूप से अपने प्रश्न को स्पष्ट करने और उत्तर देने के लिए।
fossfreedom

a.out कंपाइलर की एक विरासत विशेषता है, इसलिए यदि आप एक के लिए नहीं पूछते हैं तो यह एक अनुमानित फ़ाइल नाम पैदा करता है। यह एक अनुमति समस्या नहीं है, लेकिन कंपाइलर और C ++ कैसे काम करते हैं, इसकी गलतफहमी है।
स्पामाप्स

लिनक्स / यूनिक्स फ़ाइल-प्रकार को निर्धारित करने के लिए फ़ाइल एक्सटेंशन पर निर्भर नहीं करता है। आम तौर पर निष्पादन योग्य फ़ाइलों का कोई विस्तार नहीं होता है। साथ ही, किसी फ़ाइल को निष्पादित करने का प्रारूप आमतौर पर गोले के बीच भिन्न नहीं होता है। सभी गोले के साथ काम करना चाहिए ./a.out जब तक यह कुछ विदेशी खोल नहीं है।
जेआरटी

1
गनर - कृपया अपने कंपाइल कमांड से शुरू होने वाले टर्मिनल में पूरा आउटपुट कॉपी करें और पेस्ट करें, इसके बाद ls -l, chmod + x और अंत में एक्जक्यूट। टाइपिंग द्वारा "Whoami" अपने नाम की पुष्टि करें
fossfreedom

4

बस अपने होम फ़ोल्डर में फ़ोल्डर की प्रतिलिपि बनाएँ और यह काम करेगा। आप शायद इसे बाहरी ड्राइव या किसी चीज़ पर चलाने की कोशिश कर रहे हैं।


0

पहले जवाब में FAT-filesystems के लिए समाधान

"अगर आप FAT32- स्वरूपित फ्लैश ड्राइव पर फ़ाइलें डाल रहे हैं तो यह मामला हो सकता है। समाधान: (...) ड्राइव को fmask = 0022 या umask = 0022 (fmask को छोड़ते हुए) के साथ माउंट करें।"

आम तौर पर काम नहीं करता है - umask के लिए डिफ़ॉल्ट वैसे भी ज्यादातर 0022 है, इसलिए यह कुछ भी नहीं बदलता है।

एक अन्य माउंट पैरामीटर्स डिफ़ॉल्ट, हालांकि, प्रभावी ढंग से बायनेरिज़ के निष्पादन को रोक देता है, खासकर अगर एफएटी-फाइलसिस्टम को गैर-रूट-उपयोगकर्ता के रूप में माउंट किया जाता है: noexec

तो जैसे विकल्प के साथ बस FAT- स्वरूपित ड्राइव माउंट execकरें:

sudo mount -o exec /dev/sd.. /mountpoint

(यह आम तौर पर रूट के रूप में किया जाना चाहिए, इसलिए "सुडो") और आपको सीधे वहाँ से बायनेरिज़ निष्पादित करने में सक्षम होना चाहिए।


-2

मैं चाहता हूं कि आपके कार्यक्रम में 'मुख्य' (') फंक्शन नहीं है, जैसा कि अगर ऐसा होता, तो आपके कंपाइलर को एग्जीक्यूटेबल बनाया जाता। अभी यह कोड से भरा एक ऑब्जेक्ट फ़ाइल है, लेकिन कोई प्रवेश बिंदु नहीं है। main () C और C ++ में एक विशेष फ़ंक्शन नाम है जो कंपाइलर को ऑब्जेक्ट ऑब्जेक्ट्स के बजाय एक प्रोग्राम बनाने के लिए कहता है जिसे प्रोग्राम या लाइब्रेरी से जोड़ा जा सकता है।

मुझे यह जानने में रुचि होगी कि आप GNU GCC के c ++ कंपाइलर, g ++ के रूप में इस फाइल को बनाने के लिए किस कमांड लाइन का उपयोग करते हैं, मुझे एक साधारण प्रोग्राम w / oa मुख्य फ़ंक्शन बनाने की अनुमति नहीं देगा:

#include <iostream>

using namespace std;

void no_main()
{
  cout << "Hello World" << endl;
}

$ g++ hello.cc
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 21
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

हालाँकि अगर मैं बदलाव को 'int main' के लिए 'शून्य no_main' बनाता हूँ तो यह काम करता है:

$ g++ hello.cc
$ ./a.out
Hello World

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