Неможливо виконати файли .out, не отримуючи дозволу


11

Я написав програму C ++ і виконав її для створення файлу a.out. Однак кожного разу, коли я намагаюся запустити його, мені стає заборонено дозвіл. Я читав, що ми можемо використовувати судо, але я не можу змусити його працювати. Я використовую щось на кшталт sudo "./a.out", але це теж не працює.

Редагувати :

Ось повідомлення, яке я отримую, коли пробую "./a.out".

bash: ./a.out: Permission denied

Який вихід ls -l a.out ? Який вихід файлу a.out ? Чи виконується на USB-накопичувачі / жорсткому диску?
JRT

Його на жорсткому диску. Цей же файл створений незабаром після компіляції. Я не встановлював жодних інших параметрів.
Шамім Хафіз

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out - вихід ls -l a.out
Шамім Хафіз

Отже, виходячи з виводу ls -l a.out це проблема з дозволом. Якщо ви робите chmod + x a.out, тоді спробуйте ./a.out це виконувати? Який вихід умаска ?
JRT

@JRT: Це не виконується. "Chmod + x a.out" не дає жодного повідомлення, але схоже, що це не має ефекту. Спроба "ls -l a.out" знову ж таки показує те саме.
Шамім Хафіз

Відповіді:


19

Зазвичай g++надає створеному файлу дозволи на виконання файлів. Якщо ви не передаєте -oпараметр, файл буде названий a.out.

Дві можливі причини, через які у вашому файлі не встановлено біт виконання, з їх рішеннями:

  1. Значення umask встановлюється на значення, як 0133, тим самим запобігаючи встановленню біта виконання. Рішення: явно встановіть дозволи:

    chmod 755 a.out
    
  2. Файлова система, над якою ви працюєте, не підтримує права Linux. Це може бути, якщо ви розміщуєте файли на флеш-накопичувачі у форматі FAT32. Рішення: або створіть резервну копію файлів і відформатуйте її до ext2, або встановіть диск із ( fmask=0022або umask=0022опущення fmask). Детальнішу інформацію див. У розділі Параметри кріплення жиру на сторінці керівництва .

Для скриптів bash, у яких не встановлено біт виконання, ви можете запустити bash file.sh. Така функція існує для всіх файлів із виконаним вмістом (компільовані файли та файли з #!/path/to/interpreterнабором рядків shebang ). Щоб виконати файли без набору бітів для виконання, використовуйте спеціальний файл /lib/ld-linux.so.2(або /lib/ld-linux-x86-64.so.2для 64-бітних додатків) для запуску такої програми:

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

Ця відповідь є цікавішою, просто додам, те, як я встановив Ubuntu над Windows, і папка з назвою була створена на диску C (Windows інсталяційний диск). Цей привід відформатований як FAT32. Чи може це мати щось спільне з цим?
Шамім Хафіз

1
Ви виконали встановлення Wubi ( C:\Ubuntuбуло створено). Це не повинно бути проблемою, якщо ви не ставите файли на "C:", а не встановлення Ubuntu. Якщо ви не використовуєте Windows або маєте достатньо місця на диску, пропоную встановити Ubuntu на виділений розділ. І знову ж , NTFS / FAT32 не підтримує дозволу Linux, так що ви можете працювати sudo chown user file, chmod 755 fileвін не буде працювати. Для цього вам дійсно потрібна файлова система EXT.
Лекенштейн

3
Та сама історія, жодна з файлових систем Windows не підтримує права доступу до файлів Linux. Ви повинні розмістити файли у форматній файлі EXT.
Лекенштейн

1
Тож просто працюючи над папкою, що належить Ubuntu, слід зробити трюк, правда? Тобто, я не повинен використовувати папки, які не входять до структури файлової системи Ubuntus?
Шамім Хафіз

3
Точно, просто забувайте ~, я створюю ~/projectsі вкладаю в нього всі свої проекти, ви могли б зробити те саме.
Лекенштейн

5

.out - незвичайне розширення. Зазвичай це, як правило, означає "вихід треку".

Перевірте свій синтаксис, який ви використовуєте для складання

напр

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

Це дозволить повідомити, який формат файлу - сценарій або двійковий

Вам рідко потрібно виконувати як root, якщо ви не обмежили, хто повинен мати змогу запускати виконуваний файл.

Якщо ви компілювали як root (наприклад, sudo make), або маєте Makefile, який встановив виконуваний файл як root, то я можу запропонувати вам відновити дозвіл після входу користувача

тобто

sudo chown fred:fred a.out

тобто замініть "fred" своїм ідентифікатором користувача.


Спасибі за інформацію. Я фактично ввійшов як єдиний користувач, і я припускаю, що я є головним користувачем. Я не зовсім впевнений, чому мені так чи інакше потрібно використовувати адміністративну автентифікацію. Як мені вдасться видалити цю опцію, щоб я завжди міг запускати файли.
Шамім Хафіз

оновлено - сподіваємось уточнити і відповісти на ваше запитання.
fossfreedom

a.out є застарілою функцією компілятора, тому він створює передбачуване ім'я файлу, якщо ви його не вимагали. Це не проблема дозволів, а непорозуміння того, як працюють компілятори та C ++.
SpamapS

Linux / Unix не визначає розширення файлів для визначення типу файлу. Зазвичай виконувані файли взагалі не мають розширення. Також формат файлу, що виконується, не відрізняється між оболонками. Усі оболонки повинні працювати з ./a.out, якщо це не якась екзотична оболонка.
JRT

1
Gunner - скопіюйте та вставте повний висновок у термінал, починаючи з вашої команди компіляції, після чого ls -l, chmod + x та нарешті виконання. Підтвердьте своє ім’я, ввівши "whoami"
fossfreedom

4

просто скопіюйте папку в домашню папку, і вона спрацює. Ви, ймовірно, намагаєтеся запустити його на зовнішньому диску або щось інше.


0

Вирішення проблеми FAT-файлових систем у першій відповіді

"Це може бути так, якщо ви розміщуєте файли на флеш-пам'яті, відформатованій FAT32. Рішення: (...) встановіть накопичувач fmask = 0022 або umask = 0022 (опускаючи маску)."

зазвичай не працює - за замовчуванням для umask в основному це 0022, так що це нічого не змінює.

Однак за замовчуванням інший параметр монтажу ефективно відключає виконання бінарних файлів, особливо якщо файлова система FAT монтується як некористувач: noexec

Тому просто встановіть диски, відформатовані FAT, з таким варіантом exec:

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

(зазвичай це потрібно робити як root, звідси і "sudo"), і ви повинні мати можливість виконувати бінарні файли прямо звідти.


-2

Я б зробив ставку, щоб у вашій програмі не було функції 'main ()', як якщо б це було, ваш компілятор зробив би a.out виконуваним. Зараз це лише об'єктний файл, повний коду, але немає точки входу. main () - це ім'я спеціальної функції в C та C ++, яке вказує компілятору створити програму, а не просто об'єктивні файли, які можна пов'язати з програмою чи бібліотекою.

Мені було б цікаво дізнатись, який командний рядок ви використовували для створення цього файлу, оскільки компілятор GNU GCC c ++, g ++, не дозволить мені створити просту програму з основною функцією:

#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

Однак якщо я зміню "void no_main" на "int main", це працює:

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

5
Якби у нього не було основної функції, вона не посилалася б і тому не створювала б файл a.out .
JRT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.