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?
command-line
bash
sudo
Jack
la source
la source
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
tant que sudo, à moins de faire quelque chose commesudo bash -c 'echo …'
: Cependant, les systèmes POSIX fournissent généralement uneecho
commande externe, telle que/bin/echo
sous OS X, que sudo peut exécuter sans rigamarole. Ainsi, laecho
commande que vous exécutez habituellement et celle queecho
vous exécutez avec sudo sont probablement deux commandes différentes, mais similaires.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 lasudo
commande avec laecho "options drm_kms_helper poll=N"
ligne de commandedemande un sudo mot de passe, ouvre shell et super - utilisateur invoque
echo "options drm_kms_helper poll=N"
, qui passeecho
commande en lui transmettant"options drm_kms_helper poll=N"
echo, fonctionnant avec des
root
privilèges, affiche la chaîne sur sa sortie standard.echo
la commande se termine, le superutilisateur shell quitte, sesudo
terminele 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:
Dans le test ci-dessus, le
whoami | tee who.txt
allait créer un fichier nomméwho.txt
contenant 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.la source
Ajoutant à la réponse de Shantanu:
... ou vous pouvez utiliser une
tee
commande comme celle-ci:ou si c'est la sortie d'une commande:
la source
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
si vous ne voulez pas imprimerstdout
aussi.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
sudo
page de manuel elle-même donne un exemple de cette approche:la source
Une autre option consiste à utiliser un fichier temporaire. Ceci est utile dans un script bash.
la source
sudo dd of=
Pour ajouter comme vous voulez:
ou pour recréer le fichier à partir de zéro:
Avantages:
tee
depuis aucune/dev/null
redirectionsh
depuis aucun sous-shell explicite (mais implicite pour la redirection)dd
dispose de nombreuses options puissantes, par exemplestatus=progress
pour voir les progrès du transfertFonctionne parce que sudo transmet stdin à la commande.
la source
dd
que 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 dd
va bien sûr travailler aussi avec ici des chaînes , par exemple,sudo dd of=outfile <<<'hello world'
. [Merci pour l'édition. NB withsh -c 'cmd'
,sh
est un sous-processus qui est un shell, mais pas vraiment un sous-shell, sauf que toutes les commandes externes commencent par un.]