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


Lorsque vous utilisez sudo pour autoriser les modifications de fichiers, je reçois régulièrement une "permission refusée".

Par exemple, ma souris est agitée et lente, je veux donc désactiver l’interrogation:

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

Je suis invité à entrer un mot de passe, puis à obtenir:

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

J'ai donc essayé de faire un changement temporaire pour désactiver l'interrogation 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?


115
2017-12-19 04:12


origine




Réponses:


Redirection de sortie (via le > opérateur) est fait 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 la chaîne bash avec sudo

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

124
2017-12-19 04:22



Vous ne pouvez pas exécuter echo avec sudo? le quoi à propos du résultat que j'ai eu: saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi - saji89
vous pouvez écrire sur le fichier, faire écho "quelque chose"> quelque part. C'est en utilisant pipe. C'est le problème. - shantanu
Ok, si tel est le cas, veuillez mettre à jour votre réponse pour refléter le fait que l'exécution de l'écho est un problème dans ce cas uniquement. - saji89
Vous ne pouvez pas simplement exécuter le shell intégré echo comme sudo, sauf si vous faites quelque chose comme sudo bash -c 'echo …'; cependant, les systèmes POSIX fournissent généralement un echo commande telle que /bin/echo sous OS X, que sudo peut exécuter sans rigamarole. Ainsi, le echo commande que vous exécutez habituellement et le echo La commande que vous exécutez avec sudo est 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


La redirection de sortie se fait par le shell à partir de laquelle la commande a été appelée. Donc, tout casser en morceaux, voici ce qui se passe *:

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

  • sudo demande un mot de passe, ouvre le shell du superutilisateur et appelle echo "options drm_kms_helper poll=N"qui court echo commande en passant "options drm_kms_helper poll=N"

  • écho, courir avec root privilèges, imprime la chaîne à sa sortie standard.

  • echo la commande se termine, le shell du superutilisateur se ferme, sudo se termine

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

Pour savoir comment résoudre ce problème, consultez la réponse à @shantanu.


(*) - alors 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 d'origine remarque la redirection et tente d'ouvrir le fichier pour écrire sudo ... commander. En cas d'échec de l'ouverture du fichier, le shell n'invoque même pas la commande qui était censée écrire dans le fichier (merci à @PanosRontogiannis de le signaler).

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 whoami | tee who.txt allait créer un fichier nommé who.txt contenant le mot "root". 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.


71
2017-12-19 05:19



Il est plus probable que le shell se faufile 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 que vous décrivez ne se produisent jamais, car le fichier ne peut pas être ouvert. - Panos Rontogiannis
@PanosRontogiannis: merci, j'ai mis à jour la réponse - Sergey


Ajout à la réponse de Shantanu:

... ou vous pourriez utiliser un tee commande 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

55
2017-12-19 06:50



Une connexion en tant que root est une mauvaise idée pour le travail manuel, et une vraiment mauvaise idée pour les tâches scriptées. - l0b0
Aussi, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null si vous ne voulez pas que l'impression soit stdout ainsi que. - Fabian Tamp


Une approche que je n'ai pas vue mentionnée ici consiste à exécuter simplement la ligne de commande entière dans son propre shell. le sudo La page 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 fichier fonctionne.

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

13
2017-12-19 13:53





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 gentil que tee puisque non /dev/null redirection
  • plus gentil que sh puisque aucun sous-shell explicite (mais implicite pour la redirection)
  • dd possède de nombreuses options puissantes, par ex. status=progress pour voir les progrès du transfert

Fonctionne car sudo transmet stdin à la commande.


3
2018-05-28 06:39



C'est bon. Nous pensons à dd comme nous écrasons nos systèmes de fichiers jadis géniaux, et que nous ne réalisons pas que c'est également pour les tâches banales - et que les autres commandes en tant que root causent également de graves dommages si elles sont utilisées sur des fichiers / périphériques incorrects. Comme sudo tee, sudo dd travaillera aussi avec ici des cordes, par exemple., sudo dd of=outfile <<<'hello world'. [Merci pour la retouche. NB avec sh -c 'cmd', sh est un sous-processus qui est un shell, mais pas vraiment un sous-shell, sauf dans le sens tout les commandes externes commencent par un.] - Eliah Kagan


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

2
2017-07-29 15:51