web-dev-qa-db-fra.com

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

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

Edit:

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

bash: ./a.out: Permission denied
11
Shamim Hafiz

g++ donne généralement les autorisations d'exécution du fichier créé. Si vous ne passez pas l'option -o, le fichier s'appellera 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 mask value est définie sur une valeur telle que 0133, ce qui empêche la définition du bit d'exécution. Solution: définir 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 déposez des fichiers sur un lecteur flash au format FAT32. Solution: sauvegardez les fichiers et formatez-le sur ext2 ou montez le lecteur avec fmask=0022 ou umask=0022 (en omettant fmask). Voir la section Options de montage pour fat sur page de manuel du montage pour plus de détails.

Pour les scripts bash pour lesquels 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 ensemble Shebang line #!/path/to/interpreter). Pour exécuter des fichiers sans le bit d'exécution défini, utilisez le fichier spécial /lib/ld-linux.so.2 (ou /lib/ld-linux-x86-64.so.2 pour les applications 64 bits) pour exécuter un tel programme:

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

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

Vérifiez la 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 devrait 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 peut-être aussi vérifier que le fichier de sortie a été écrit correctement en tant que fichier binaire.

c'est à dire.

file a.out

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

Vous devez rarement exécuter en tant que root, sauf si vous avez limité le nombre de personnes pouvant exécuter l’exécutable.

Si vous avez compilé en tant que root (par exemple Sudo make), ou si vous avez un fichier 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 d'utilisateur.

5
fossfreedom

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

4
user65868

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

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

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

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

Il suffit donc de monter des lecteurs au format FAT avec l’option exec comme ceci:

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

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

0
wolfy