182 votes

Comment résoudre le problème de "permission denied" lors de l'utilisation de sudo avec redirection dans Bash ?

Lorsque j'utilise sudo pour autoriser la modification de fichiers, je reçois régulièrement le message "permission denied".

Par exemple, ma souris est instable et lente, je veux donc désactiver l'interrogation :

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

On me demande un mot de passe, puis on me demande :

bash: /etc/modprobe.d/local.conf: Permission denied

J'ai donc essayé de faire un changement temporaire pour désactiver les sondages en utilisant :

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

Encore une fois, le système a répondu par :

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

Des idées ?

220voto

shantanu Points 7751

Redirection de la sortie (via le > ) est effectué par le Shell, et non pas par le echo . Vous devez vous connecter en tant que root

sudo -i

Alors vous pouvez utiliser la redirection

echo N> /sys/module/drm_kms_helper/parameters/poll

Sinon, vous pouvez exécuter la chaîne bash avec sudo

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"

85voto

John Points 9

La redirection de la sortie est effectuée par le Shell. à partir duquel la commande a été invoquée . Donc, en cassant tout en morceaux, voici ce qui se passe* :

  • Shell invoque sudo echo "options drm_kms_helper poll=N" qui exécute sudo avec echo "options drm_kms_helper poll=N" ligne de commande

  • sudo demande un mot de passe, ouvre le superutilisateur Shell et invoque echo "options drm_kms_helper poll=N" qui fonctionne echo en lui passant la commande "options drm_kms_helper poll=N"

  • echo, fonctionnant avec root privilège, imprime la chaîne sur sa sortie standard.

  • echo se termine, le superutilisateur Shell sort, sudo met fin à

  • le Shell à partir duquel la commande a été invoquée collecte la sortie et tente de la rediriger vers /etc/modprobe.d/local.conf qui n'est accessible en écriture qu'à la racine. Il obtient l'erreur "permission denied".

Pour les moyens de résoudre ce problème, voir la réponse de @shantanu.


(*) - bien que la séquence ci-dessus aide à comprendre pourquoi la commande échoue, en réalité les choses se passent un peu dans le désordre : le Shell original remarque la redirection et essaie d'ouvrir le fichier en écriture avant d'invoquer la commande sudo ... commande. Lorsque l'ouverture du fichier échoue, le Shell n'invoque même pas la commande qui était censée écrire dans le fichier (merci à @PanosRontogiannis de l'avoir signalé).

Voici un test rapide :

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

Dans le test ci-dessus, le whoami | tee who.txt allait créer un fichier nommé who.txt contenant le mot "root". Cependant, lorsque la redirection de sortie échoue dans le Shell appelant, le fichier "who.txt" est également manquant car la commande n'a pas été invoquée.

67voto

Rich Armstrong Points 1083

Vous pouvez utiliser un tee comme ceci :

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

Ou si c'est la sortie d'une commande :

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

Si vous souhaitez ajouter au fichier cible plutôt que de l'écraser - c'est-à-dire faire tee se comporter comme >> plutôt que > -- vous utiliseriez tee -a .

18voto

Obie 2.0 Points 395

Une approche que je n'ai pas vue mentionnée ici est de simplement exécuter la ligne de commande entière dans son propre Shell. Le site sudo donne elle-même un exemple de cette approche :

Pour faire une liste d'utilisation des répertoires dans la partition /home. Notez que ceci exécute les commandes dans un sous-Shell pour faire fonctionner les cd et la redirection des fichiers.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

4voto

user545424 Points 165

Une autre option consiste à utiliser un fichier temporaire. Ceci est utile dans un script de bash.

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X