Commande introuvable lors de l'utilisation de sudo
J'ai un script appelé foo.sh
dans mon dossier home.
Quand je accéder à ce dossier, et entrez ./foo.sh
, je reçois
-bash: ./foo.sh: Permission denied
.
Lorsque j'utilise sudo ./foo.sh
, je reçois
sudo: foo.sh: command not found
.
Pourquoi cela se passe et comment je peux résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Permission denied
Pour exécuter un script, le fichier doit avoir un exécutable permission de l'ensemble de peu de.
Afin de comprendre pleinement Linux les autorisations de fichier vous pouvez étudier la documentation du
chmod
de commande. chmod, une abréviation de changer de mode, est la commande qui est utilisé pour modifier les paramètres d'autorisation d'un fichier.De lire le chmod documentation de votre système local , exécutez
man chmod
ouinfo chmod
à partir de la ligne de commande. Une fois lu et compris, vous devriez être en mesure de comprendre la sortie de course à pied ...... pour consulter la liste de LECTURE, d'ÉCRITURE et d'EXÉCUTION des autorisations pour le propriétaire du fichier, le groupe propriétaire et toute autre personne qui n'est pas le propriétaire du fichier ou d'un membre du groupe auquel appartient le fichier (la dernière autorisation de groupe est parfois appelé "monde" ou "autres")
Voici un résumé de la façon de résoudre le erreur Permission Denied dans votre cas.
Propriétaire a accès en lecture et écriture rw, mais l' - indique que le fichier exécutable de l'autorisation est manquant
La
chmod
commande des correctifs. (Groupe et d'autres uniquement en lecture de l'ensemble d'autorisations sur le dossier, ils ne peuvent pas écrire ou exécuter)foo.sh est maintenant exécutable autant que Linux est concerné.
De l'utilisation de sudo résultats dans la Commande introuvable
Lorsque vous exécutez une commande à l'aide sudo vous sont effectivement en l'exécutant en tant que superutilisateur ou de la racine.
La raison que l'utilisateur root n'est pas de trouver votre commande est probable que le
PATH
variable d'environnement pour le root ne comprennent pas les répertoire oùfoo.sh
est situé. D'où la commande n'est pas trouvée.La variable d'environnement PATH contient une liste de répertoires qui sont recherchés pour les commandes. Chaque utilisateur définit leur propre variable de CHEMIN d'accès en fonction de leurs besoins.
Pour voir ce qu'il est configuré pour s'exécuter
Voici un exemple de sortie de l'exécution de la ci-dessus
env
première commande en tant qu'utilisateur simple et puis tant qu'utilisateur root avec la commande sudoNoter que, bien que similaires, dans ce cas, les répertoires contenus dans le CHEMIN d'accès de l'utilisateur non privilégié (rkielty) et le super utilisateur sont pas la même.
Le répertoire où
foo.sh
se trouve n'est pas présent dans la variable de CHEMIN d'accès de l'utilisateur racine, d'où le commande pas trouvé erreur.sudo $PWD/temp.sh
ne fonctionne pas non plus, tandis quesudo echo $PWD
montre juste ce que j'attendais. (Mac)sudo
'sPATH
le même que l'utilisateur?sudo asterisk -r
, qui n'a pas fonctionné. Asterisk est situé dans/usr/sbin
, et c'était dans le CHEMIN de la racine, mais pas dans mon CHEMIN. Après l'ajout de/usr/sbin
de mon CHEMIN d'accès de l'utilisateur, il a travaillé. Vous dites "la variable d'environnement PATH de root ne pas inclure le répertoire où foo.sh est situé", donc, vous dites que je devrais ajouter le chemin vers le CHEMIN de la racine, ce qui est contraire à mes conclusions.sudo
's"command not found"
n'a rien à voir avec le CHEMIN; si vous définissez les autorisations d'exécution, puissudo
l'exécute! C'est juste un caprice en sudo (qui doit sans doute être fixe; les messages d'erreur ne devrait pas être gratuite, inexactes).Les autres solutions que j'ai vu jusqu'ici sont fondées sur un système de définitions, mais il est en fait possible d'avoir
sudo
utiliser lesPATH
(avec leenv
de commande) et/ou le reste de l'environnement (avec la-E
option) juste en invoquant ce droit:En fait, on peut faire un alias hors de lui:
(Il est aussi possible de le nom de l'alias lui-même
sudo
, en remplacement de l'originalsudo
.)command not found
problème dans la distro Ubuntu. Merci homme.Vérifier secure_path sur sudo
Si
$PATH
est remplacée utilisationvisudo
et modifier/etc/sudoers
chmod +x foo.sh
#!/bin/sh
ou quelque chose du genre.sudo pwd
Vous pouvez également créer un doux lien vers votre script dans un des répertoires (
/usr/local/bin
par exemple) dans le super utilisateur CHEMIN. Il va ensuite être disponible pour le sudo.Ont un coup d'oeil à cette réponse pour avoir une idée de l'annuaire de mettre des liens symboliques dans.
Il semble que linux va dire "command not found", même si vous l'avez explicitement donner le chemin d'accès au fichier.
C'est un peu trompeuse erreur, cependant, c'est sans doute techniquement correcte. Un fichier n'est pas une commande jusqu'à ce que son exécutable, et donc ne peut pas être trouvé.
Ok c'est ma solution:
dans ~/.bash_aliases il suffit d'ajouter le texte suivant:
Le tour est joué!
Maintenant, vous pouvez exécuter vos propres scripts avec sudo ou définir en tant que ROOT sans avoir à faire un export PATH=$PATH:/home/your_user/bin à chaque fois.
Avis que j'ai besoin d'être explicite lors de l'ajout de mon CHEMIN, puisque la MAISON pour le super utilisateur est /root
Essayer
chmod u+x foo.sh
au lieu dechmod +x foo.sh
si vous avez des problèmes avec les guides ci-dessus. Cela a fonctionné pour moi quand les autres solutions n'ont pas.Il y a d'excellentes réponses ci-dessus. Si, après avoir essayé, vous obtenez toujours
command not found
essayer de nouveau avec la totalité du fichier chemin d'accès: