.Out-Dateien können nicht ausgeführt werden, da die Berechtigung verweigert wird

11

Ich habe ein C ++ - Programm geschrieben und es befolgt, um eine Out-Datei zu erstellen. Wenn ich jedoch versuche, es auszuführen, wird mir die Berechtigung verweigert. Ich habe gelesen, dass wir sudo verwenden können, aber ich kann es nicht ganz zum Laufen bringen. Ich benutze so etwas wie sudo "./a.out", aber auch das funktioniert nicht.

Bearbeiten :

Hier ist die Nachricht, die ich bekomme, wenn ich "./a.out" versuche.

bash: ./a.out: Permission denied
Shamim Hafiz
quelle
Was ist die Ausgabe von ls -l a.out ? Was ist die Ausgabe von Datei a.out ? Ist die ausführbare Datei auf einem USB-Speicherstick / einer Festplatte?
JRT
Es ist auf der Festplatte. Es ist dieselbe Datei, die kurz nach dem Kompilierungsprozess erstellt wurde. Ich habe keine anderen Parameter eingestellt.
Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Ist die Ausgabe von ls -l a.out
Shamim Hafiz
Basierend auf der Ausgabe von ls -l a.out handelt es sich also um ein Berechtigungsproblem. Wenn Sie chmod + x a.out ausführen, versuchen Sie es mit ./a.out. Wird es ausgeführt? Was ist die Ausgabe von umask ?
JRT
@JRT: Es wird nicht ausgeführt. Wenn Sie "chmod + x a.out" ausführen, wird keine Nachricht angezeigt, aber es sieht so aus, als hätte dies keine Auswirkung. Der erneute Versuch von "ls -l a.out" zeigt immer noch dasselbe.
Shamim Hafiz

Antworten:

18

Gibt g++der erstellten Datei normalerweise Ausführungsberechtigungen. Wenn Sie die -oOption nicht übergeben , wird die Datei benannt a.out.

Zwei mögliche Gründe, warum für Ihre Datei das Ausführungsbit mit ihren Lösungen nicht gesetzt ist:

  1. Der umask-Wert wird auf einen Wert wie 0133 gesetzt, wodurch verhindert wird, dass das Ausführungsbit gesetzt wird. Lösung: Legen Sie die Berechtigungen explizit fest:

    chmod 755 a.out
    
  2. Das Dateisystem, an dem Sie arbeiten, unterstützt keine Linux-Berechtigungen. Dies kann der Fall sein, wenn Sie Dateien auf einem FAT32-formatierten Flash-Laufwerk ablegen. Lösung: Sichern Sie die Dateien und formatieren Sie sie in ext2 oder mounten Sie das Laufwerk mit fmask=0022oder umask=0022(weglassen fmask). Siehe die Mount - Optionen für den Fett Abschnitt auf der Hilfeseite des Bergs für weitere Details.

Für Bash-Skripte, für die das Ausführungsbit nicht gesetzt ist, können Sie ausführen bash file.sh. Eine solche Funktion gibt es für alle Dateien mit ausführbarem Inhalt (kompilierte Dateien und Dateien mit einem Shebang-Zeilensatz #!/path/to/interpreter). Verwenden Sie zum Ausführen von Dateien ohne gesetztes Ausführungsbit die spezielle Datei /lib/ld-linux.so.2(oder /lib/ld-linux-x86-64.so.2für 64-Bit-Anwendungen), um ein solches Programm auszuführen:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
quelle
Diese Antwort ist interessanter, nur um hinzuzufügen, wie ich Ubuntu über Windows installiert habe und ein Ordner mit dem Namen auf dem Laufwerk C (Windows-Installationslaufwerk) erstellt wurde. Dieses Laufwerk ist als FAT32 formatiert. Könnte das etwas damit zu tun haben?
Shamim Hafiz
1
Sie haben eine Wubi-Installation durchgeführt ( C:\Ubuntuwurde erstellt). Dies sollte kein Problem sein, es sei denn, Sie legen Dateien auf "C:" und nicht auf Ihre Ubuntu-Installation. Wenn Sie Windows nicht verwenden oder über ausreichend Speicherplatz verfügen, empfehle ich, Ubuntu auf einer dedizierten Partition zu installieren. Und wieder unterstützt NTFS / FAT32 KEINE Linux-Berechtigungen, so dass Sie ausführen sudo chown user filekönnen chmod 755 file, es wird nicht funktionieren. Dafür benötigen Sie wirklich ein EXT-Dateisystem.
Lekensteyn
3
In der gleichen Geschichte unterstützt keines der Windows-Dateisysteme Linux-Dateiberechtigungen. Sie sollten die Dateien in einem mit EXT formatierten Dateisystem ablegen.
Lekensteyn
1
Es sollte also den Trick machen, einfach an einem Ordner zu arbeiten, der zu Ubuntu gehört, oder? Ich meine, ich sollte keine Ordner verwenden, die nicht Teil der Ubuntus-Dateisystemstruktur sind.
Shamim Hafiz
3
Genau, bleib einfach drin ~, ich erstelle ~/projectsund lege alle meine Projekte hinein, du könntest das Gleiche tun.
Lekensteyn
5

.out ist eine ungewöhnliche Erweiterung. Normalerweise würde dies eine "Trace-Ausgabe" -Datei bedeuten.

Überprüfen Sie Ihre Syntax, die Sie zum Kompilieren verwenden

z.B

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

oder vielleicht

g++ myfile.cpp -lm -o outputfilename

Sie sollten überprüfen, ob das ausführbare Bit in der Datei gesetzt ist

ls -l a.out

oder Sie können einfach das ausführbare Bit erzwingen

chmod +x a.out

dann können Sie Ihre Datei ausführen

./a.out

oder einfach

a.out

Sie sollten möglicherweise auch überprüfen, ob die Ausgabedatei korrekt als Binärdatei geschrieben wurde

dh

file a.out

Hiermit wird angegeben, welches Format die Datei hat - entweder ein Skript oder eine Binärdatei

Sie müssen selten als Root ausgeführt werden, es sei denn, Sie haben eingeschränkt, wer die ausführbare Datei ausführen soll.

Wenn Sie als root kompiliert haben (z. B. sudo make) oder ein Makefile haben, das die ausführbare Datei als root installiert hat, kann ich vorschlagen, dass Sie die Berechtigung wiedererlangen, wenn sich der Benutzer anmeldet

dh

sudo chown fred:fred a.out

dh "fred" durch deine Benutzer-ID ersetzen.

Fossfreiheit
quelle
Danke für die Auskunft. Ich bin tatsächlich als einziger Benutzer angemeldet und nehme an, dass ich der Hauptbenutzer bin. Ich bin mir nicht ganz sicher, warum ich sowieso die administrative Authentifizierung verwenden muss. Wie könnte ich diese Option entfernen, damit ich die Dateien immer ausführen kann?
Shamim Hafiz
aktualisiert - hoffentlich um Ihre Frage zu klären und zu beantworten.
Fossfreiheit
a.out ist eine Legacy-Funktion des Compilers, sodass ein vorhersehbarer Dateiname erstellt wird, wenn Sie nicht nach einem gefragt haben. Dies ist kein Berechtigungsproblem, sondern ein Missverständnis der Funktionsweise von Compilern und C ++.
SpamapS
Linux / Unix ist nicht auf Dateierweiterungen angewiesen, um den Dateityp zu bestimmen. Normalerweise haben ausführbare Dateien überhaupt keine Erweiterung. Außerdem unterscheidet sich das Format zum Ausführen einer Datei im Allgemeinen nicht zwischen Shells. Alle Muscheln sollten mit ./a.out funktionieren, es sei denn, es handelt sich um eine exotische Muschel.
JRT
1
Gunner - Bitte kopieren Sie die gesamte Ausgabe und fügen Sie sie in das Terminal ein, beginnend mit Ihrem Kompilierungsbefehl, gefolgt von ls -l, chmod + x und schließlich der Ausführung. Bitte bestätigen Sie Ihren Namen mit "whoami"
fossfreedom
4

Kopieren Sie einfach den Ordner in Ihren Home-Ordner und es wird funktionieren. Sie versuchen wahrscheinlich, es auf einem externen Laufwerk oder etwas anderem auszuführen.

user65868
quelle
0

Die Problemumgehung für FAT-Dateisysteme in der ersten Antwort

"Dies kann der Fall sein, wenn Sie Dateien auf einem FAT32-formatierten Flash-Laufwerk ablegen. Lösung: (...) Mounten Sie das Laufwerk mit fmask = 0022 oder umask = 0022 (ohne fmask)."

funktioniert normalerweise nicht - die Standardeinstellung für umask ist sowieso meistens 0022, daher ändert dies nichts.

Die Standardeinstellung eines anderen Mount-Parameters verhindert jedoch effektiv die Ausführung von Binärdateien, insbesondere wenn das FAT-Dateisystem als Nicht-Root-Benutzer gemountet ist: noexec

Mounten Sie also einfach FAT-formatierte Laufwerke mit der folgenden Option exec:

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

(Dies muss normalerweise als root erfolgen, daher das "sudo") und Sie sollten in der Lage sein, Binärdateien direkt von dort aus auszuführen.

Wolf
quelle
-2

Ich würde wetten, dass Ihr Programm keine 'main ()' - Funktion hat, als hätte Ihr Compiler a.out ausführbar gemacht. Im Moment ist es nur eine Objektdatei voller Code, aber es gibt keinen Einstiegspunkt. main () ist ein spezieller Funktionsname in C und C ++, der den Compiler anweist, ein Programm zu erstellen und nicht nur Objektdateien, die mit einem Programm oder einer Bibliothek verknüpft werden können.

Es würde mich interessieren, mit welcher Befehlszeile Sie diese Datei erstellt haben, da der c ++ - Compiler von GNU GCC, g ++, es mir nicht ermöglicht, ein einfaches Programm ohne Hauptfunktion zu erstellen:

#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

Wenn ich jedoch 'void no_main' in 'int main' ändere, funktioniert es:

$ g++ hello.cc
$ ./a.out
Hello World
SpamapS
quelle
5
Wenn er keine hatte Haupt- Funktion, wäre es nicht verknüpfen und daher wäre es keine produzieren a.out - Datei.
JRT