Impossible d'exécuter les fichiers .out, obtention de l'autorisation refusée

11

J'ai écrit un programme C ++ et je l'ai exécuté pour produire un fichier .out. Cependant, chaque fois que j'essaye de l'exécuter, j'obtiens une autorisation refusée. J'ai lu que nous pouvons utiliser sudo, mais je n'arrive pas à le faire fonctionner. J'utilise quelque chose comme, sudo "./a.out" mais cela ne fonctionne pas non plus.

Modifier :

Voici le message que je reçois lorsque j'essaie "./a.out".

bash: ./a.out: Permission denied
Shamim Hafiz
la source
Quelle est la sortie de ls -l a.out ? Quelle est la sortie du fichier a.out ? L'exécutable se trouve-t-il sur une clé USB / un disque dur?
JRT
C'est sur le disque dur. C'est le même fichier créé peu de temps après le processus de compilation. Je n'ai défini aucun autre paramètre.
Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Est la sortie de ls -l a.out
Shamim Hafiz
Donc, sur la base de la sortie de ls -l a.out, c'est un problème d'autorisations. Si vous faites chmod + x a.out, essayez ./a.out s'exécute- t-il? Quelle est la sortie de umask ?
JRT
@JRT: il ne s'exécute pas. Faire "chmod + x a.out" ne donne aucun message, mais semble n'avoir aucun effet. Réessayer "ls -l a.out" montre toujours la même chose.
Shamim Hafiz

Réponses:

19

Habituellement, g++donne au fichier créé des autorisations d'exécution. Si vous ne passez pas l' -ooption, le fichier sera nommé a.out.

Deux raisons possibles pour lesquelles votre fichier n'a pas le bit d'exécution défini, avec leurs solutions:

  1. La valeur umask est définie sur une valeur comme 0133, empêchant ainsi le bit d'exécution d'être défini. Solution: définissez explicitement les autorisations:

    chmod 755 a.out
    
  2. Le système de fichiers sur lequel vous travaillez ne prend pas en charge les autorisations Linux. Cela pourrait être le cas si vous placez des fichiers sur un lecteur flash au format FAT32. Solution: sauvegardez les fichiers et formatez-les en ext2 ou montez le lecteur avec fmask=0022ou umask=0022(en omettant fmask). Voir la section Options de montage pour le gras sur la page de manuel du montage pour plus de détails.

Pour les scripts bash dont le bit d'exécution n'est pas défini, vous pouvez exécuter bash file.sh. Une telle fonctionnalité existe pour tous les fichiers avec un contenu exécutable (fichiers compilés et fichiers avec un #!/path/to/interpreterensemble de lignes shebang ). Pour exécuter des fichiers sans le jeu de bits d'exécution, utilisez le fichier spécial /lib/ld-linux.so.2(ou /lib/ld-linux-x86-64.so.2pour les applications 64 bits) pour exécuter un tel programme:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
la source
Cette réponse est plus intéressante, juste pour ajouter, la façon dont j'ai installé Ubuntu sur Windows et un dossier nommé a été créé sur le lecteur C (lecteur d'installation de Windows). Ce lecteur est formaté en FAT32. Cela pourrait-il avoir quelque chose à voir avec cela?
Shamim Hafiz
1
Vous avez fait une installation Wubi ( C:\Ubuntuavait été créée). Cela ne devrait pas être un problème à moins que vous ne mettiez des fichiers sur "C:" et non sur votre installation Ubuntu. Si vous n'utilisez pas Windows ou que vous disposez de beaucoup d'espace disque, je vous suggère d'installer Ubuntu sur une partition dédiée. Et encore une fois, NTFS / FAT32 ne supporte pas les autorisations Linux, de sorte que vous pouvez exécuter sudo chown user file, chmod 755 fileil ne fonctionnera pas. Vous avez vraiment besoin d'un système de fichiers EXT pour cela.
Lekensteyn
3
La même histoire, aucun des systèmes de fichiers Windows ne prend en charge les autorisations de fichiers Linux. Vous devez placer les fichiers sur un système de fichiers au format EXT.
Lekensteyn
1
Donc, simplement travailler sur un dossier appartenant à Ubuntu devrait faire l'affaire, non? Je veux dire, je ne devrais pas utiliser des dossiers qui ne font pas partie de la structure du système de fichiers Ubuntus?
Shamim Hafiz
3
Exactement, restez dedans ~, je crée ~/projectset y mets tous mes projets, vous pourriez faire la même chose.
Lekensteyn
5

.out est une extension inhabituelle. Habituellement, cela signifierait normalement un fichier "sortie de trace".

Vérifiez votre syntaxe que vous utilisez pour compiler

par exemple

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

ou peut-être

g++ myfile.cpp -lm -o outputfilename

Vous pouvez examiner pour voir si le bit exécutable est défini sur le fichier

ls -l a.out

ou vous pouvez simplement forcer le bit exécutable

chmod +x a.out

alors vous pouvez exécuter votre fichier

./a.out

ou simplement

a.out

Vous devriez aussi peut-être vérifier que le fichier de sortie a été écrit correctement en tant que binaire

c'est à dire

file a.out

Cela indiquera le format du fichier - un script ou un binaire

Vous devez rarement exécuter en tant que root, sauf si vous avez restreint les personnes qui devraient pouvoir exécuter l'exécutable.

Si vous avez compilé en tant que root (par exemple sudo make), ou avez un Makefile qui a installé l'exécutable en tant que root, puis-je vous suggérer de récupérer l'autorisation en tant qu'utilisateur connecté

c'est à dire

sudo chown fred:fred a.out

c'est-à-dire remplacer "fred" par votre identifiant.

liberté de fossé
la source
Merci pour l'information. Je suis en fait connecté en tant que seul utilisateur et je suppose que je suis le principal utilisateur. Je ne sais pas trop pourquoi je dois quand même utiliser l'authentification administrative. Comment pourrais-je supprimer cette option pour que je puisse toujours exécuter les fichiers.
Shamim Hafiz
mis à jour - si tout va bien pour clarifier et répondre à votre question.
fossfreedom
a.out est une fonctionnalité héritée du compilateur, il produit donc un nom de fichier prévisible si vous n'en avez pas demandé un. Ce n'est pas un problème d'autorisations, mais une mauvaise compréhension du fonctionnement des compilateurs et C ++.
SpamapS
Linux / Unix ne s'appuie pas sur les extensions de fichier pour déterminer le type de fichier. Les fichiers normalement exécutables n'ont aucune extension. En outre, le format pour exécuter un fichier ne diffère généralement pas entre les shells. Toutes les coquilles devraient fonctionner avec ./a.out sauf s'il s'agit d'une coquille exotique.
JRT
1
Gunner - veuillez copier et coller la sortie complète dans le terminal en commençant par votre commande de compilation, suivie de ls -l, chmod + x et enfin de l'exécution. Veuillez confirmer votre nom en tapant "whoami"
fossfreedom
4

copiez simplement le dossier dans votre dossier personnel et cela fonctionnera. Vous essayez probablement de l'exécuter sur un disque externe ou quelque chose.

user65868
la source
0

La solution de contournement pour les systèmes de fichiers FAT dans la première réponse

"Cela pourrait être le cas si vous placez des fichiers sur un lecteur flash au format FAT32. Solution: (...) montez le lecteur avec fmask = 0022 ou umask = 0022 (en omettant fmask)."

ne fonctionne normalement pas - la valeur par défaut pour umask est généralement 0022 de toute façon, donc cela ne change rien.

Cependant, un autre paramètre de montage par défaut interdit effectivement l'exécution des binaires, surtout si le système de fichiers FAT est monté en tant qu'utilisateur non root: noexec

Il suffit donc de monter des disques au format FAT avec l'option execcomme ceci:

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

(cela doit normalement être fait en tant que root, d'où le "sudo") et vous devriez pouvoir exécuter des binaires directement à partir de là.

loup
la source
-2

Je parie que votre programme n'a pas de fonction 'main ()', comme si c'était le cas, votre compilateur aurait créé un exécutable .out. Pour le moment, il ne s'agit que d'un fichier objet plein de code, mais il n'y a pas de point d'entrée. main () est un nom de fonction spécial en C et C ++ qui indique au compilateur de créer un programme plutôt que simplement des fichiers objets qui peuvent être liés à un programme ou une bibliothèque.

Je serais intéressé de savoir quelle ligne de commande vous avez utilisée pour produire ce fichier, car le compilateur c ++ de GNU GCC, g ++, ne me permettra pas de créer un programme simple sans fonction 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

Cependant, si je modifie «void no_main» en «int main», cela fonctionne:

$ g++ hello.cc
$ ./a.out
Hello World
SpamapS
la source
5
S'il n'avait pas de fonction principale , il ne serait pas lié et donc il ne produirait pas de fichier a.out .
JRT