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
command-line
executable
c++
compiler
Shamim Hafiz
quelle
quelle
Antworten:
Gibt
g++
der erstellten Datei normalerweise Ausführungsberechtigungen. Wenn Sie die-o
Option nicht übergeben , wird die Datei benannta.out
.Zwei mögliche Gründe, warum für Ihre Datei das Ausführungsbit mit ihren Lösungen nicht gesetzt ist:
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:
fmask=0022
oderumask=0022
(weglassenfmask
). 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.2
für 64-Bit-Anwendungen), um ein solches Programm auszuführen:quelle
C:\Ubuntu
wurde 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ührensudo chown user file
könnenchmod 755 file
, es wird nicht funktionieren. Dafür benötigen Sie wirklich ein EXT-Dateisystem.~
, ich erstelle~/projects
und lege alle meine Projekte hinein, du könntest das Gleiche tun..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
oder vielleicht
Sie sollten überprüfen, ob das ausführbare Bit in der Datei gesetzt ist
oder Sie können einfach das ausführbare Bit erzwingen
dann können Sie Ihre Datei ausführen
oder einfach
Sie sollten möglicherweise auch überprüfen, ob die Ausgabedatei korrekt als Binärdatei geschrieben wurde
dh
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
dh "fred" durch deine Benutzer-ID ersetzen.
quelle
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.
quelle
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
:(Dies muss normalerweise als root erfolgen, daher das "sudo") und Sie sollten in der Lage sein, Binärdateien direkt von dort aus auszuführen.
quelle
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:
Wenn ich jedoch 'void no_main' in 'int main' ändere, funktioniert es:
quelle