Impossibile eseguire i file .out, negando l'autorizzazione


11

Ho scritto un programma C ++ e l'ho rispettato per produrre un file .out. Tuttavia, ogni volta che provo a eseguirlo, ottengo l'autorizzazione negata. Ho letto che possiamo usare sudo, ma non riesco proprio a farlo funzionare. Uso qualcosa del tipo, sudo "./a.out" ma anche quello non funziona.

Modifica :

Ecco il messaggio che ricevo quando provo "./a.out".

bash: ./a.out: Permission denied

Qual è l'output di ls -l a.out ? Qual è l'output del file a.out ? L'eseguibile è su una chiavetta USB / disco rigido?
JRT,

È su disco rigido. È lo stesso file creato subito dopo il processo di compilazione. Non ho impostato altri parametri.
Shamim Hafiz,

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out È l'output di ls -l a.out
Shamim Hafiz

Quindi, in base all'output di ls -l a.out, si tratta di un problema di autorizzazioni. Se fai chmod + x a.out, prova ./a.out che esegue? Qual è l'output di umask ?
JRT,

@JRT: non viene eseguito. Fare "chmod + x a.out" non dà alcun messaggio, ma sembra che non abbia alcun effetto. Cercare di nuovo "ls -l a.out" mostra ancora la stessa cosa.
Shamim Hafiz,

Risposte:


19

In genere, g++concede le autorizzazioni di esecuzione al file creato. Se non si passa l' -oopzione, il file verrà denominato a.out.

Due possibili motivi per cui il file non ha il bit di esecuzione impostato, con le relative soluzioni:

  1. Il valore umask è impostato su un valore come 0133, impedendo così l'impostazione del bit di esecuzione. Soluzione: impostare esplicitamente le autorizzazioni:

    chmod 755 a.out
    
  2. Il filesystem su cui stai lavorando non supporta le autorizzazioni Linux. Questo potrebbe essere il caso se stai inserendo file su un'unità flash formattata FAT32. Soluzione: eseguire il backup dei file e formattarlo su ext2 o montare l'unità con fmask=0022o umask=0022(omettendo fmask). Vedi le opzioni di montaggio per sezione fat nella pagina del manuale di mount per maggiori dettagli.

Per gli script bash che non hanno il bit di esecuzione impostato, è possibile eseguire bash file.sh. Tale funzionalità esiste per tutti i file con contenuto eseguibile (file compilati e file con un #!/path/to/interpreterset di linee shebang ). Per eseguire i file senza il set di bit di esecuzione, utilizzare il file speciale /lib/ld-linux.so.2(o /lib/ld-linux-x86-64.so.2per le applicazioni a 64 bit) per eseguire tale programma:

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

Questa risposta è più interessante, solo per aggiungere, il modo in cui ho installato Ubuntu è su Windows e una cartella denominata è stata creata sull'unità C (unità di installazione di Windows). Questa unità è formattata come FAT32. Questo potrebbe avere qualcosa a che fare con quello?
Shamim Hafiz,

1
Hai eseguito un'installazione di Wubi ( C:\Ubuntuera stata creata). Questo non dovrebbe essere un problema a meno che tu non stia mettendo i file su "C:" e non l'installazione di Ubuntu. Se non stai utilizzando Windows o hai molto spazio su disco, ti suggerisco di installare Ubuntu su una partizione dedicata. E di nuovo, NTFS / FAT32 NON supporta le autorizzazioni Linux, quindi è possibile eseguire sudo chown user file, chmod 755 filenon funzionerà. Hai davvero bisogno di un filesystem EXT per questo.
Lekensteyn,

3
La stessa storia, nessuno dei filesystem di Windows supporta i permessi dei file Linux. Dovresti mettere i file su un file system formattato EXT.
Lekensteyn,

1
Quindi, semplicemente lavorando su una cartella che appartiene a Ubuntu dovrebbe fare il trucco, giusto? Voglio dire, non dovrei usare cartelle che non fanno parte della struttura del file system Ubuntus?
Shamim Hafiz,

3
Esatto, resta e ~creo ~/projectse ci metto dentro tutti i miei progetti, potresti fare la stessa cosa.
Lekensteyn,

5

.out è un'estensione insolita. Di solito questo significherebbe normalmente un file "traccia output".

Controlla la sintassi che stai usando per compilare

per esempio

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

o forse

g++ myfile.cpp -lm -o outputfilename

È possibile esaminare se il bit eseguibile è impostato sul file

ls -l a.out

oppure puoi semplicemente forzare il bit eseguibile

chmod +x a.out

allora puoi eseguire il tuo file

./a.out

o semplicemente

a.out

Forse dovresti anche verificare che il file di output sia stato scritto correttamente come binario

vale a dire

file a.out

Questo riporterà il formato del file: uno script o un file binario

Raramente è necessario eseguire come root a meno che non si sia limitato chi dovrebbe essere in grado di eseguire l'eseguibile.

Se hai compilato come root (ad esempio sudo make) o hai un Makefile che ha installato l'eseguibile come root, allora posso suggerirti di riguadagnare l'autorizzazione quando l'utente ha effettuato l'accesso

vale a dire

sudo chown fred:fred a.out

cioè sostituisci "fred" con il tuo ID utente.


Grazie per l'informazione. Ho effettivamente effettuato l'accesso come unico utente e presumo di essere l'utente principale. Non sono del tutto sicuro del perché debba comunque utilizzare l'autenticazione amministrativa. Come potrei rimuovere questa opzione in modo da poter sempre eseguire i file.
Shamim Hafiz,

aggiornato - si spera di chiarire e rispondere alla tua domanda.
fossfreedom

a.out è una funzionalità legacy del compilatore, quindi produce un nome file prevedibile se non ne hai richiesto uno. Questo non è un problema di autorizzazioni, ma un fraintendimento di come funzionano i compilatori e il C ++.
SpamapS

Linux / Unix non si basa sulle estensioni dei file per determinare il tipo di file. I file normalmente eseguibili non hanno alcuna estensione. Inoltre, il formato per eseguire un file non differisce generalmente tra le shell. Tutte le shell dovrebbero funzionare con ./a.out a meno che non sia una shell esotica.
JRT

1
Gunner: copia e incolla l'output completo nel terminale a partire dal comando di compilazione, seguito da ls -l, chmod + x e infine l'esecuzione. Conferma il tuo nome digitando "whoami"
fossfreedom

4

basta copiare la cartella nella cartella principale e funzionerà. Probabilmente stai cercando di eseguirlo su un disco esterno o qualcosa del genere.


0

La soluzione alternativa per i filesystem FAT nella prima risposta

"Questo potrebbe essere il caso se stai inserendo file su un'unità flash formattata FAT32. Soluzione: (...) monta l'unità con fmask = 0022 o umask = 0022 (omettendo fmask)."

normalmente non funziona - il valore predefinito per umask è comunque principalmente 0022, quindi questo non cambia nulla.

L'impostazione predefinita di un altro parametro mount, tuttavia, non consente l'esecuzione di file binari, soprattutto se il file system FAT è montato come utente non root: noexec

Quindi basta montare unità formattate in FAT con l'opzione in questo execmodo:

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

(questo normalmente deve essere fatto come root, quindi "sudo") e dovresti essere in grado di eseguire i binari direttamente da lì.


-2

Scommetto che il tuo programma non ha una funzione 'main ()', come se lo fosse, il tuo compilatore avrebbe reso eseguibile a.out. Al momento è solo un file oggetto pieno di codice, ma non esiste un punto di ingresso. main () è un nome di funzione speciale in C e C ++ che dice al compilatore di creare un programma piuttosto che solo file oggetto che possono essere collegati a un programma o una libreria.

Sarei interessato a sapere quale riga di comando hai usato per produrre questo file, in quanto il compilatore c ++ di GNU GCC, g ++, non mi permetterà di creare un semplice programma senza una funzione principale:

#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

Tuttavia, se cambio 'void no_main' in 'int main' funziona:

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

5
Se non avesse una funzione principale , non si collegherebbe e quindi non produrrebbe un file a.out .
JRT,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.