Pb permission denied sur terminal

ugo_dml

Membre enregistré
26 Mars 2014
3
0
Bonjour à tous,

Dans le cadre de mes études, j'utilise mon mac pour travailler en C.
Seulement voila ces derniers temps un problème récurrent est apparu. En effet lorsque je souhaite exécuter un executable, étape qui suit la compilation de mon programme C, mon terminal me renvois "permission denied"... N'étant pas une fléche en informatique, impossible de trouver une solution à ce problème de plus en plus gênant.
Pourriez vous me venir en aide ?
Si je n'est pas été assez clair n’hésitez pas à m'en demander plus.

Merci bien.
 
Salut ugo_dml.

Ma conjecture : tu n'as pas fixé l'executable_bit sur ton fichier, ce qui rend ton exécutable - non_exécutable :D (c'est une des occurrences où le retour dans le «Terminal» est : permission denied).

Pour vérifier l'état des lieux, dans le «Terminal» tu passes la commande :

Bloc de code:
ls -al /chemin_à_mon_exécutable/mon_exécutable

en te contentant de saisir a la mano
Bloc de code:
ls -al
, de sauter un espace et de faire un glisser-déposer direct de ton fichier dans la fenêtre du «Terminal» ce qui renseigne automatiquement le chemin au fichier et le nom du fichier. Pour un binaire UNIX natif d'OSX, par exemple fsck, tu obtiendrais :

Bloc de code:
-r-xr-xr-x  root  wheel   /sbin/fsck

- désigne le statut de fichier de l'objet ; r comme read la permission de lecture ; - l'absence de la permission intermédiaire possible : w comme write = écriture ; et x comme execute la permission d'exécution du fichier dès lors qu'il s'agit d'un programme. Et tu as une succession de 3 triplettes, car il y a 3 accédants concernés possibles : l'user, le group et (implicite) l'other (n'importe qui).

Les 2 termes qui suivent dans mon exemple identifient donc l'utilisateur propriétaire (ici root = le Super-User) et le groupe de référence (ici wheel = le groupe-Système).

--> S'il te manque des x partout sur ton fichier, c'est qu'il lui manque l'executable_bit qui donne la permission de ... l'exécuter. Si tu n'es pas référencé comme l'utilisateur propriétaire, par ailleurs, mais suppose que ce soit root (avec le groupe wheel au lieu de staff ou admin), il se peut que sans l'invocation préalable de sudo tu ne puisses pas l'exécuter, si le dernier accédant (implicite) = everyone (other) au rang desquels tu tomberais n'avait pas la permission d'exécution (où si l'impact de l'exécutable sur le Système nécessitait l'invocation préalable de sudo afin de passer conjoncturellement en droits root).

--------------------​

Mais trêve de laïus : en supposant qu'il n'y ait pas de problème d'accédant-propriétaire (le fichier est ton œuvre, on va donc imaginer de son utilisateur par défaut est ugo = toi), pour rajouter l'executable_bit, soit tu ne le spécifies que pour toi seul ainsi :

Bloc de code:
chmod u+x /chemin_à_mon_fichier/mon_fichier

(mais tu pourrais faire un g+x pour attribuer l'executable_bit au groupe de référence), soit tu l'attribues aux 3 niveaux des accédants ainsi :

Bloc de code:
chmod 755 /chemin_à_mon_fichier/mon_fichier

en valeur octale (r=4, w=2, x=1 --> 7 = 4+2+1 = rwx ; 6 = 4+2+0 = rw- ; 5 = 4+0+1 = r-x ; 4 = 4+0+0 = r-- etc.), d'où 755 équivaut à un :

Bloc de code:
-rwxr-xr-x  ugo staff

en supposant que l'utilisateur est ugo et le groupe staff --> tu peux te mitonner tes permissions à ta guise. Par exemple, encore :

Bloc de code:
chmod 777 /chemin_à_mon_exécutable/mon_exécutable

donnerait un :

Bloc de code:
-rwxrwxrwx ugo staff

en supposant toujours que l'utilisateur est ugo et le groupe staff, ce qui est peut-être excessif question permissions d'écriture au fichier (à tout moment, un nouvelle commande dans le «Terminal» sur le même fichier permet d'éditer <mettre à jour> les droits : accédants et/ou permissions. Donc on peut toujours corriger un loupé).

--------------------​
 
Dernière édition par un modérateur:
Salut ugo_dml.

Ma conjecture : tu n'as pas fixé l'executable_bit sur ton fichier, ce qui rend ton exécutable - non_exécutable :D (c'est une des occurrences où le retour dans le «Terminal» est : permission denied).

--------------------​

Franchement j'en doute. Le compilateur fait lui même le chmod +x sur l'exécutable qu'il produit.

Ça ressemble plutôt à un fichier qui est sur un système de fichiers problématique. (en particulier option noexec visible dans mount)

Il faudrait que l'OP donne le résultat de la commande mount et spécifie dans quel dossier se trouve son executable.
 
Effectivement je n'ai pas les droit d'executable, je précise que je suis sur mon mac, j'en suis donc "l'admin".



je ne comprend pas reellement la solution que vous me proposer ?
quand je suis dans mon dossier ou est le fichier, je rentre la commande : chmod u+x / coucou.c
Le terminal me répond qu'il connait pas cette commande... :(
 
Effectivement je n'ai pas les droit d'executable, je précise que je suis sur mon mac, j'en suis donc "l'admin".



je ne comprend pas reellement la solution que vous me proposer ?
quand je suis dans mon dossier ou est le fichier, je rentre la commande : chmod u+x / coucou.c
Le terminal me répond qu'il connait pas cette commande... :(

Il faut que tu enlèves le slash et que tu apprennes les bases de la navigation dans une arborescence Unix. Le fait que tu mettes un espace entre / et coucou.c me laisse penser que tu n'as aucune idée de ce que tu fais. Ne tapes jamais des commandes aveuglément dans un terminal.

Sinon, peux tu donner le resultat de (quand tu es dans le dossier concerné):

pwd

et

mount

?
 
ugo,

pour la commande, tu tapes d'abord :

Bloc de code:
chmod u+x

tu sautes un espace, tu fais un glisser-déposer direct du fichier coucou.c dans la fenêtre du «Terminal» et tu actives la commande en pressant la touche &#8617;&#65038; ('Entrée') du clavier. Ça va te donner les droits suivants :

Bloc de code:
-rw[COLOR="RoyalBlue"]x[/COLOR]r--r--   ugodemoulin   staff

Si tu voulais généraliser l'executive_bit, alors tu saisirais à la place de chmod u+x -->

Bloc de code:
chmod 755

et idem : saut d'un espace, glisser-déposer de coucou.c et &#8617;&#65038; --> tu obtiendrais alors les droits suivants :

Bloc de code:
-rw[COLOR="RoyalBlue"]x[/COLOR]r-[COLOR="RoyalBlue"]x[/COLOR]r-[COLOR="RoyalBlue"]x[/COLOR]   ugodemoulin   staff

Sinon, si tu t'es logé au préalable par la commande cd dans le dossier parent de tes fichiers, tu te contentes d'un :

Bloc de code:
chmod u+x coucou.c

comme indiqué par alecail :coucou:

[par ailleurs, si tu observes le chemin créé lors du glisser-déposer, tu t'aperçois que le chemin absolu part du point de montage / de l'OS et décrit la façon de parvenir logiquement au point d'arrivée de ton fichier (en passant à coups de séparateurs du répertoire racine à un sous-répertoire à un... jusqu'au dossier parent immédiat qui contient ton fichier). Si tu t'es par contre déjà logé dans le dossier parent par un cd, alors les fichiers cibles de commandes se pointent directement par leurs noms.]
 
Dernière édition par un modérateur:
1/ De toute façon sans le résultat du mount, ça ne sert à rien de chercher plus à l'aider, vu que l'erreur peut venir de là mais qu'il n'a pas répondu

Il faudrait le résultat de mount pour savoir si le problème vient du système de fichiers


2/ bien évidemment, c'est chmod +x coucou, SANS le point C

OK: chmod +x coucou
PAS OK: chmod +x coucou.c

Il ne faudrait pas en plus embrouiller l'OP.

Il n'y a qu'un fichier qui est concerné pas le chmod +x, c'est l'executable.

Il peut taper:

file *

dans le dossier concerné pour trouvé le fichier exécutable:
Son type sera: Mach-O 64-bit executable x86_64


Je voudrais rajouter aussi que l'OP ne précise pas comment il tente d'exécuter le programme, et que personne ne lui a demandé..

Donc autre question: comment lances tu l'exécutable ?

Il faudrait aussi que tu précises comment tu compiles le fichier source, car ça me semble bizarre que le flag x ne soit pas mis dessus (ou logique si le système de fichier pose problème)

---------- Nouveau message ajouté à 18h13 ---------- Le message précédent a été envoyé à 17h26 ----------

Effectivement je n'ai pas les droit d'executable, je précise que je suis sur mon mac, j'en suis donc "l'admin".



je ne comprend pas reellement la solution que vous me proposer ?
quand je suis dans mon dossier ou est le fichier, je rentre la commande : chmod u+x / coucou.c
Le terminal me répond qu'il connait pas cette commande... :(

Si effectivement tu tapes chmod dans un terminal et qu'il te dit:

bash: chmod: command not found

c'est que tu as traffiqué le $PATH dans .bashrc, ou que tu as un problème plus grave sur le système de fichiers, et ceci indépendemment que la commnande chmod u+x / coucou.c n'ait aucun sens.
 
Dernière édition:
Effectivement je n'ai pas les droit d'executable, je précise que je suis sur mon mac, j'en suis donc "l'admin".



je ne comprend pas reellement la solution que vous me proposer ?
quand je suis dans mon dossier ou est le fichier, je rentre la commande : chmod u+x / coucou.c
Le terminal me répond qu'il connait pas cette commande... :(
Dans un shell (ici, bash) on utilise des variables d'environnement, c'est-à-dire des variables dont le contenu peut être exploité par le shell lui-même et toute commande passée à l'intérieur du shell [normalement la notion de variable t'est connue puisque tu développes].
La variable PATH donne la liste des répertoires où trouver des commandes : cela permet d'éviter d'avoir à donner le chemin complet de certaines commandes. On met leur répertoire dans PATH et il suffira de taper le nom de la commande.

Tape la commande suivante :
Bloc de code:
/bin/echo $PATH
pour qu'on sache où en est cette variable d'environnement.

Par ailleurs, je suis intrigué par ton coucou. Dans la mesure où c'est un exécutable issu de la compilation de coucou.c il devrait avoir les droits d'exécution (genre -rwxr-xr-x), idem pour GestionFichiers. Quelle commande utilises-tu pour compiler les sources et créer les exécutables ?

Enfin, sache que, très généralement, le répertoire courant ("."), en tant que répertoire courant, n'est que très rarement inclus dans la liste des chemins. Donc pour exécuter ton programme coucou, une fois les autres problèmes (PATH, droits...) réglés, tu devras l'exécuter en indiquant son chemin (absolu ou relatif).
 
L'OP ne semble plus intéressé au problème (ou alors Macg n'envoie pas de mel pour le prévenir alors il ne sait pas ?)..

Est-ce qu'il y a encore des gens qui s'amusent à mettre . dans le $PATH ? Ça m'a tenté une fois aux débuts de Linux dans les années 90, car venant de DOS à l'époque c'était correct de faire:

C:> CD \
C:> CD JEUX
C:> CD DUNE2
C:> DUNE2 ( <-- executable)


et on voulait retrouvait ce type de syntaxe, donc c'était une motivation pour rajouter . dans la PATH.

On a la chance avec OS X d'avoir un vrai Unix certifié http://www.opengroup.org/openbrand/register/ je trouve ça dommage de ne pas apprendre les bases d'Unix..
 
Il est justement en train de tout découvrir ;)
Ah ! les joies du C.