Nie można wykonać plików .out, odmowa uzyskania uprawnień

11

Napisałem program w C ++ i zastosowałem go do utworzenia pliku .out. Jednak za każdym razem, gdy próbuję go uruchomić, otrzymuję odmowę zezwolenia. Czytałem, że możemy używać sudo, ale nie do końca mogę go uruchomić. Używam czegoś takiego jak sudo „./a.out”, ale to też nie działa.

Edytuj :

Oto wiadomość, którą otrzymuję, gdy próbuję „./a.out”.

bash: ./a.out: Permission denied
Shamim Hafiz
źródło
Jaka jest wydajność ls -l a.out ? Jakie są dane wyjściowe pliku a.out ? Czy plik wykonywalny jest na karcie pamięci USB / dysku twardym?
JRT
Jest na dysku twardym. Jest to ten sam plik utworzony wkrótce po procesie kompilacji. Nie ustawiłem żadnych innych parametrów.
Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Jest to wynik działania ls -l a.out
Shamim Hafiz
Więc w oparciu o dane wyjściowe ls -l a.out jest to problem z uprawnieniami. Jeśli wykonasz chmod + x a.out, a następnie spróbuj ./a.out to wykona? Jaka jest wydajność umask ?
JRT
@JRT: Nie wykonuje się. Wykonanie „chmod + x a.out” nie daje żadnej wiadomości, ale wygląda na to, że nie ma żadnego efektu. Ponowna próba „ls -l a.out” nadal pokazuje to samo.
Shamim Hafiz

Odpowiedzi:

19

Zwykle g++daje utworzone uprawnienia do wykonywania pliku. Jeśli nie przejdziesz -oopcji, plik zostanie nazwany a.out.

Dwa możliwe powody, dla których plik nie ma ustawionego bitu wykonania, wraz z ich rozwiązaniami:

  1. Wartość umask jest ustawiona na wartość taką jak 0133, co zapobiega ustawianiu bitu wykonania. Rozwiązanie: jawnie ustaw uprawnienia:

    chmod 755 a.out
    
  2. System plików, nad którym pracujesz, nie obsługuje uprawnień systemu Linux. Może tak być w przypadku umieszczania plików na dysku flash w formacie FAT32. Rozwiązanie: wykonaj kopię zapasową plików i sformatuj ją do ext2 lub zamontuj dysk za pomocą fmask=0022lub umask=0022(pomijając fmask). Zobacz sekcję Opcje montażu tłuszczu na stronie instrukcji montażu, aby uzyskać więcej informacji.

W przypadku skryptów bash, które nie mają ustawionego bitu wykonania, możesz uruchomić bash file.sh. Taka funkcja istnieje dla wszystkich plików z zawartością wykonywalną (pliki skompilowane i pliki z #!/path/to/interpreterzestawem linii shebang ). Aby wykonać pliki bez zestawu bitów wykonania, użyj specjalnego pliku /lib/ld-linux.so.2(lub /lib/ld-linux-x86-64.so.2aplikacji 64-bitowych), aby uruchomić taki program:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
źródło
Ta odpowiedź jest bardziej interesująca, aby dodać, że sposób, w jaki zainstalowałem Ubuntu, działa w systemie Windows, a folder o nazwie został utworzony na dysku C (dysk instalacyjny systemu Windows). Ten dysk jest sformatowany jako FAT32. Czy to może mieć z tym coś wspólnego?
Shamim Hafiz
1
Zrobiłeś instalację Wubi ( C:\Ubuntuzostał stworzony). Nie powinno to stanowić problemu, chyba że umieścisz pliki na „C:”, a nie na instalacji Ubuntu. Jeśli nie korzystasz z systemu Windows lub masz dużo miejsca na dysku, sugeruję zainstalowanie Ubuntu na dedykowanej partycji. I znowu, NTFS / FAT32 nie obsługuje uprawnienia Linux, więc można uruchomić sudo chown user file, chmod 755 fileto nie będzie działać. Naprawdę potrzebujesz do tego systemu plików EXT.
Lekensteyn
3
Ta sama historia, żaden z systemów plików Windows nie obsługuje uprawnień do plików systemu Linux. Pliki należy umieścić w systemie plików sformatowanym EXT.
Lekensteyn
1
Więc po prostu praca nad folderem należącym do Ubuntu powinna załatwić sprawę, prawda? Mam na myśli, że nie powinienem używać folderów, które nie są częścią struktury systemu plików Ubuntus?
Shamim Hafiz
3
Właśnie, zostań ~, tworzę ~/projectsi wkładam w to wszystkie moje projekty, możesz zrobić to samo.
Lekensteyn
5

.out jest nietypowym rozszerzeniem. Zwykle oznaczałoby to plik „śledzenia wyjścia”.

Sprawdź swoją składnię, której używasz do kompilacji

na przykład

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

albo może

g++ myfile.cpp -lm -o outputfilename

Możesz sprawdzić, czy bit wykonywalny jest ustawiony w pliku

ls -l a.out

lub możesz po prostu wymusić bit wykonywalny

chmod +x a.out

wtedy możesz uruchomić swój plik

./a.out

lub po prostu

a.out

Być może powinieneś również sprawdzić, czy plik wyjściowy został poprawnie zapisany jako plik binarny

to znaczy

file a.out

Spowoduje to zgłoszenie formatu pliku - skryptu lub pliku binarnego

Rzadko musisz uruchamiać się jako root, chyba że masz ograniczone możliwości uruchomienia pliku wykonywalnego.

Jeśli skompilowałeś jako root (np. Sudo make) lub masz plik Makefile, który zainstalował plik wykonywalny jako root, to czy mogę zasugerować, abyś odzyskał uprawnienia po zalogowaniu się użytkownika

to znaczy

sudo chown fred:fred a.out

tzn. zamień „fred” na identyfikator użytkownika.

fossfreedom
źródło
Dzięki za informację. Jestem zalogowany jako jedyny użytkownik i zakładam, że jestem głównym użytkownikiem. Nie jestem pewien, dlaczego i tak muszę korzystać z uwierzytelnienia administracyjnego. Jak mogę usunąć tę opcję, aby zawsze móc uruchamiać pliki.
Shamim Hafiz
zaktualizowane - mam nadzieję, że wyjaśnią i odpowiedzą na twoje pytanie.
fossfreedom
a.out jest starszą funkcją kompilatora, więc tworzy przewidywalną nazwę pliku, jeśli nie poprosiłeś o nią. Nie jest to problem z uprawnieniami, ale nieporozumienie dotyczące działania kompilatorów i C ++.
SpamapS
Linux / Unix nie polega na rozszerzeniach plików w celu określenia typu pliku. Zwykle pliki wykonywalne nie mają w ogóle rozszerzenia. Ponadto format pliku wykonywalnego nie różni się zasadniczo między powłokami. Wszystkie muszle powinny działać z ./a.out, chyba że jest to jakaś egzotyczna muszla.
JRT
1
Strzelec - skopiuj i wklej pełne dane wyjściowe do terminala, zaczynając od polecenia kompilacji, a następnie ls -l, chmod + x i na końcu wykonanie. Potwierdź swoje imię, wpisując „whoami”
fossfreedom
4

po prostu skopiuj folder do folderu domowego i będzie działać. Prawdopodobnie próbujesz uruchomić go na zewnętrznym dysku lub coś takiego.

użytkownik65868
źródło
0

Obejście dla systemów plików FAT w pierwszej odpowiedzi

„Może tak być w przypadku umieszczania plików na dysku flash sformatowanym w systemie FAT32. Rozwiązanie: (...) zamontuj dysk za pomocą fmask = 0022 lub umask = 0022 (pomijając fmask).”

normalnie nie działa - domyślnie i tak umask to w większości 0022, więc nic to nie zmienia.

Jednak inny domyślny parametr montowania skutecznie uniemożliwia wykonywanie plików binarnych, szczególnie jeśli system plików FAT jest zamontowany jako użytkownik inny niż root: noexec

Po prostu zamontuj dyski w formacie FAT z opcją exec:

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

(zwykle należy to zrobić jako root, stąd „sudo”) i powinieneś być w stanie wykonywać pliki binarne bezpośrednio z tego miejsca.

wolfy
źródło
-2

Założę się, że twój program nie ma funkcji 'main ()', tak jakby to zrobił, twój kompilator spowodowałby, że a.out jest wykonywalny. W tej chwili jest to po prostu plik obiektowy pełen kodu, ale nie ma punktu wejścia. main () jest specjalną nazwą funkcji w C i C ++, która mówi kompilatorowi, aby utworzył program, a nie tylko pliki obiektowe, które można połączyć z programem lub biblioteką.

Chciałbym wiedzieć, jakiego wiersza poleceń użyłeś do utworzenia tego pliku, ponieważ kompilator c ++ GNU GCC, g ++, nie pozwoli mi stworzyć prostego programu bez głównej funkcji:

#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

Jeśli jednak zmienię „void no_main” na „int main”, to zadziała:

$ g++ hello.cc
$ ./a.out
Hello World
Spamapy
źródło
5
Gdyby nie miał żadnej głównej funkcji, nie łączyłby się i dlatego nie tworzyłby pliku a.out .
JRT