Не удается выполнить файлы .out, получение разрешения запрещено

11

Я написал программу на C ++ и выполнил ее для создания файла .out. Однако всякий раз, когда я пытаюсь запустить его, я получаю разрешение на отказ. Я читал, что мы можем использовать sudo, но не могу заставить его работать. Я использую что-то вроде 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» еще раз показывает то же самое.
Шамим Хафиз

Ответы:

18

Обычно 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набором строк Шебанга ). Чтобы выполнить файлы без установленного бита выполнения, используйте специальный файл /lib/ld-linux.so.2(или /lib/ld-linux-x86-64.so.2для 64-битных приложений) для запуска такой программы:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
источник
Этот ответ более интересен, просто чтобы добавить, как я установил 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

т.е. замените "Фред" на ваш идентификатор пользователя.

свобода ископаемых
источник
Спасибо за информацию. Я на самом деле вошел в систему как единственный пользователь, и я предполагаю, что я основной пользователь. Я не совсем уверен, почему мне все равно нужно использовать административную аутентификацию. Как бы я мог удалить эту опцию, чтобы я всегда мог запустить файлы.
Шамим Хафиз
обновлено - надеюсь уточнить и ответить на ваш вопрос.
fossfreedom
a.out является устаревшей функцией компилятора, поэтому он создает предсказуемое имя файла, если вы его не спрашивали. Это не проблема с разрешениями, а неправильное понимание того, как работают компиляторы и C ++.
SpamapS
Linux / Unix не использует расширения файлов для определения типа файла. Обычно исполняемые файлы не имеют расширения вообще. Кроме того, формат для исполняемого файла не отличается между оболочками вообще. Все оболочки должны работать с ./a.out, если это не экзотическая оболочка.
JRT
1
Gunner - пожалуйста, скопируйте и вставьте полный вывод в терминал, начиная с вашей команды компиляции, затем ls -l, chmod + x и, наконец, выполнение. Пожалуйста, подтвердите свое имя, набрав "whoami"
fossfreedom
4

просто скопируйте папку в вашу домашнюю папку, и она будет работать. Вы, вероятно, пытаетесь запустить его на внешнем диске или что-то.

user65868
источник
0

Обходной путь для FAT-файловых систем в первом ответе

«Это может иметь место, если вы помещаете файлы на флэш-накопитель в формате FAT32. Решение: (...) смонтируйте диск с помощью fmask = 0022 или umask = 0022 (без fmask)».

обычно не работает - по умолчанию umask в большинстве случаев равен 0022, так что это ничего не меняет.

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

Так что просто смонтируйте диски в формате FAT с помощью опции exec:

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

(обычно это нужно делать с правами root, отсюда и «sudo»), и вы сможете запускать двоичные файлы прямо оттуда.

Волчок
источник
-2

Держу пари, что ваша программа не имеет функции main (), как если бы она была, ваш компилятор сделал бы исполняемый файл .out. Прямо сейчас это просто объектный файл, полный кода, но нет точки входа. main () - это имя специальной функции в C и C ++, которое указывает компилятору создавать программу, а не просто объектные файлы, которые могут быть связаны с программой или библиотекой.

Мне было бы интересно узнать, какую командную строку вы использовали для создания этого файла, поскольку g ++ компилятор GNU GCC 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
SpamapS
источник
5
Если бы у него не было основной функции, он не связывался бы и, следовательно, не создал бы файл a.out .
JRT