Permission refusée
Pour exécuter un script, le fichier doit avoir un bit d'autorisation exécutable défini .
Afin de bien comprendre les autorisations des fichiers Linux , vous pouvez étudier la documentation de la chmod
commande. chmod , une abréviation de mode de modification , est la commande utilisée pour modifier les paramètres d'autorisation d'un fichier.
Pour lire la documentation chmod de votre système local, exécutez man chmod
ou à info chmod
partir de la ligne de commande. Une fois lu et compris, vous devriez être en mesure de comprendre le résultat de l'exécution ...
ls -l foo.sh
... qui répertorie les autorisations READ, WRITE et EXECUTE pour le propriétaire du fichier, le propriétaire du groupe et tous les autres qui ne sont pas le propriétaire du fichier ou un membre du groupe auquel appartient le fichier (ce dernier groupe d'autorisations est parfois appelé comme "monde" ou "autre")
Voici un résumé de la façon de résoudre l' erreur Autorisation refusée dans votre cas.
$ ls -l foo.sh # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
Le propriétaire dispose d'un accès en lecture et en écriture rw mais le - indique que l'autorisation exécutable est manquante
La chmod
commande corrige cela. (Les groupes et autres n'ont que des autorisations de lecture définies sur le fichier, ils ne peuvent pas y écrire ni l'exécuter)
$ chmod +x foo.sh # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
foo.sh est maintenant exécutable en ce qui concerne Linux.
L'utilisation de sudo résultats dans la commande introuvable
Lorsque vous exécutez une commande à l'aide de sudo, vous l'exécutez effectivement en tant que superutilisateur ou root.
La raison pour laquelle l'utilisateur root ne trouve pas votre commande est probablement que la PATH
variable d'environnement pour root n'inclut pas le répertoire où foo.sh
se trouve . Par conséquent, la commande n'est pas trouvée.
La variable d'environnement PATH contient une liste de répertoires dans lesquels les commandes sont recherchées. Chaque utilisateur définit sa propre variable PATH en fonction de ses besoins. Pour voir ce qu'il est configuré pour s'exécuter
env | grep ^PATH
Voici un exemple de sortie de l'exécution de la env
commande ci-dessus en tant qu'utilisateur ordinaire, puis en tant qu'utilisateur root à l'aide de sudo
rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Notez que, bien que similaires, dans ce cas, les répertoires contenus dans le PATH l'utilisateur non privilégié (rkielty) et le super utilisateur ne sont pas les mêmes .
Le répertoire où foo.sh
réside n'est pas présent dans la variable PATH de l'utilisateur root, d'où l' erreur command not found .
sudo
« estPATH
la même chose que de l'utilisateur?Les autres solutions que j'ai vues ici jusqu'à présent sont basées sur certaines définitions du système, mais il est en fait possible d'avoir
sudo
utiliser le courantPATH
(avec laenv
commande) et / ou le reste de l'environnement (avec l'-E
option) juste en l'appelant correctement :En fait, on peut en faire un alias:
(Il est également possible de nommer l'alias lui
sudo
- même , en remplaçant l'originalsudo
.)la source
command not found
problèmes rencontrés dans la distribution Ubuntu. Merci mec../bashrc
pour l'enregistrer entre les sessionsVérifier les secure_path sur sudo
Si
$PATH
est remplacé, utilisezvisudo
et modifiez/etc/sudoers
la source
chmod +x foo.sh
#!/bin/sh
ou une telle.sudo pwd
la source
Vous pouvez également créer un lien logiciel vers votre script dans l'un des répertoires (
/usr/local/bin
par exemple) du superutilisateur PATH. Il sera alors disponible pour le sudo.Jetez un œil à cette réponse pour avoir une idée du répertoire dans lequel placer le lien logiciel.
la source
Il semble que Linux dira "commande introuvable" même si vous indiquez explicitement le chemin du fichier.
C'est une erreur quelque peu trompeuse, mais elle est probablement techniquement correcte. Un fichier n'est pas une commande avant son exécutable et ne peut donc pas être trouvé.
la source
Ok, c'est ma solution: dans ~ / .bash_aliases, ajoutez simplement ce qui suit:
Voila! Vous pouvez maintenant exécuter vos propres scripts avec sudo ou définir comme ROOT sans avoir à faire d'export PATH = $ PATH: / home / your_user / bin à chaque fois.
Notez que je dois être explicite lors de l'ajout de mon PATH puisque HOME pour le superutilisateur est / root
la source
Essayez
chmod u+x foo.sh
plutôt quechmod +x foo.sh
si vous rencontrez des problèmes avec les guides ci-dessus. Cela a fonctionné pour moi quand les autres solutions n'ont pas fonctionné.la source
Il y a d'excellentes réponses ci-dessus. Si, après les avoir essayés, vous obtenez toujours
command not found
réessayer avec le chemin d'accès complet du fichier:la source