Comment résoudre «autorisation refusée» lors de l'utilisation de sudo avec redirection dans Bash?

138

Lorsque j'utilise sudo pour autoriser la modification de fichiers, je reçois régulièrement une «autorisation refusée».

Par exemple, ma souris est nerveuse et lente, je souhaite donc désactiver la scrutation:

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

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

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

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

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

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

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

Des idées?

Jack
la source

Réponses:

158

La redirection de sortie (via l' >opérateur) est effectuée par le shell, pas par écho . Vous devez vous connecter en tant que root

sudo -i

Ensuite, vous pouvez utiliser la redirection

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

Sinon, vous pouvez lancer bash string avec sudo

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"
Shantanu
la source
1
Vous ne pouvez pas faire écho avec sudo? le que sur le résultat que j'ai obtenu:saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
saji89
vous pouvez écrire sur le fichier, faire écho "quelque chose"> quelque part. Il utilise un tuyau .. C'est le problème.
Shantanu
4
Ok, si c'est le cas, veuillez mettre à jour votre réponse afin de refléter le fait que l'exécution de l'écho n'est un problème que dans ce cas.
Saji89
Vous ne pouvez pas simplement exécuter le shell intégré en echotant que sudo, à moins de faire quelque chose comme sudo bash -c 'echo …': Cependant, les systèmes POSIX fournissent généralement une echocommande externe, telle que /bin/echosous OS X, que sudo peut exécuter sans rigamarole. Ainsi, la echocommande que vous exécutez habituellement et celle que echovous exécutez avec sudo sont probablement deux commandes différentes, mais similaires.
Kojiro
Si tel est le cas, pourquoi les réponses à cette question suggèrent-elles un écho? askubuntu.com/questions/840431/…
Harsha le
75

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

  • shell appelle sudo echo "options drm_kms_helper poll=N", qui exécute la sudocommande avec la echo "options drm_kms_helper poll=N"ligne de commande

  • demande un sudo mot de passe, ouvre shell et super - utilisateur invoque echo "options drm_kms_helper poll=N", qui passe echocommande en lui transmettant"options drm_kms_helper poll=N"

  • echo, fonctionnant avec des rootprivilèges, affiche la chaîne sur sa sortie standard.

  • echola commande se termine, le superutilisateur shell quitte, se sudotermine

  • le shell à partir duquel la commande a été appelée collecte la sortie et essaie de la rediriger vers /etc/modprobe.d/local.conf, qui est accessible en écriture uniquement par root. Il obtient l'erreur "autorisation refusée".

Pour résoudre ce problème, consultez la réponse de @shantanu.


(*) - Bien que la séquence ci-dessus aide à comprendre pourquoi la commande échoue, dans la réalité, les choses se passent un peu dans l’ordre: le shell original remarque la redirection et essaie d’ouvrir le fichier en écriture avant d’appeler la sudo ...commande. En cas d'échec de l'ouverture du fichier, le shell n'invoque même pas la commande 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.txtallait créer un fichier nommé who.txtcontenant le mot "racine". Toutefois, lorsque la redirection de sortie échoue dans le shell appelant, le fichier "who.txt" est également manquant car la commande n'a pas été appelée.

Sergey
la source
Il est plus probable que le shell se "forque" lui-même et tente d'ouvrir /etc/modprobe.d/local.conf avant d'essayer d'exécuter "sudo", ce qui signifie que les 4 premières étapes décrites ne se produisent jamais car le fichier ne peut pas être ouvert.
Panos Rontogiannis
1
@PanosRontogiannis: merci, j'ai mis à jour la réponse
Sergey
60

Ajoutant à la réponse de Shantanu:

... ou vous pouvez utiliser une teecommande comme celle-ci:

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
Sans titre
la source
3
La connexion +1 en tant que root est une mauvaise idée pour le travail manuel et une très mauvaise idée pour les tâches scriptées.
l0b0
2
Aussi, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/nullsi vous ne voulez pas imprimer stdoutaussi.
Fabian Tamp
16

Une approche que je n'ai pas vue mentionnée ici consiste simplement à exécuter la ligne de commande complète dans son propre shell. La sudopage de manuel elle-même donne un exemple de cette approche:

Pour créer une liste d'utilisation des répertoires de la partition / home. Notez que cela exécute les commandes dans un sous-shell pour que la redirection de cd et de fichiers fonctionne.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
kojiro
la source
Ouah merci. une solution simple
résilience
4

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

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

sudo dd of=

Pour ajouter comme vous voulez:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

ou pour recréer le fichier à partir de zéro:

echo inbytes | sudo dd of=outfile

Avantages:

  • plus sympa que teedepuis aucune /dev/nullredirection
  • plus agréable que shdepuis aucun sous-shell explicite (mais implicite pour la redirection)
  • dddispose de nombreuses options puissantes, par exemple status=progresspour voir les progrès du transfert

Fonctionne parce que sudo transmet stdin à la commande.

Ciro Santilli 改造 心 心 心
la source
1
C'est bon. Nous pensons ddque la façon dont nous écrasons nos systèmes de fichiers autrefois géniaux ne nous rendons pas compte que ce soit aussi pour des tâches banales - et que d'autres commandes en tant que root causent également de graves dommages si elles sont utilisées sur de mauvais fichiers / périphériques. Commesudo tee , sudo ddva bien sûr travailler aussi avec ici des chaînes , par exemple, sudo dd of=outfile <<<'hello world'. [Merci pour l'édition. NB with sh -c 'cmd', shest un sous-processus qui est un shell, mais pas vraiment un sous-shell, sauf que toutes les commandes externes commencent par un.]
Eliah Kagan