C'est une question assez simple, au moins il semble que cela devrait être, sur les autorisations sudo sous Linux.
Il y a de nombreuses fois où je veux simplement ajouter quelque chose /etc/hosts
ou un fichier similaire, mais je ne peux pas le faire car les deux >
et >>
ne sont pas autorisés, même avec root.
Existe-t-il un moyen de faire ce travail sans avoir à su
ou sudo su
en root?
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
feraittee -a
au lieu detee --append
.-a
--append
indicateur ( ), la commande écraserait le fichier entier avec la chaîne donnée au lieu de l'ajouter à la fin.Le problème est que le shell produit une redirection, pas sudo ou echo, donc cela se fait en tant qu'utilisateur normal.
Essayez l'extrait de code suivant:
la source
sh
, echo peut interpréter des séquences d'échappement comme à l'\t
intérieur de guillemets simples. Vous pouvez utiliser à laprintf %s 'something'
place.sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
par exemple.Le problème est que c'est votre shell qui gère la redirection; il essaie d'ouvrir le fichier avec vos autorisations et non celles du processus que vous exécutez sous sudo.
Utilisez quelque chose comme ça, peut-être:
la source
sudo
(pour des raisons de sécurité) ne propage pas l'environnement au sous-processus. Vous pouvez utilisersudo -E
pour contourner cette restriction.sudo sh -c "echo 'something' >> $FILENAME"
, avec des guillemets doubles, ce sera travail - la substitution de variables est faite par l'enveloppe extérieure, et non la coquille sudoed.la source
Faire
devrait marcher. Le problème est que> et >> sont gérés par votre shell, pas par la commande "sudoed", donc les permissions sont les vôtres, pas celles de l'utilisateur dans lequel vous "sudoing".
la source
Je note, pour les curieux, que vous pouvez également citer un hérédoc (pour les gros blocs):
la source
"
mais ne provoque pas l'échec de la commande.)En bash, vous pouvez utiliser
tee
en combinaison avec> /dev/null
pour garder stdout propre.la source
En utilisant la réponse de Yoo , mettez ceci dans votre
~/.bashrc
:Vous pouvez maintenant exécuter
sudoe 'deb blah # blah' /etc/apt/sources.list
Éditer:
Une version plus complète qui vous permet de diriger l'entrée ou la redirection à partir d'un fichier et comprend un
-a
commutateur pour désactiver l'ajout (qui est activé par défaut):la source
Vous pouvez également utiliser à
sponge
partir dumoreutils
package et pas besoin de rediriger la sortie (c'est-à-dire, pas detee
bruit à cacher):la source
En utilisant sed -i avec $ a , vous pouvez ajouter du texte, contenant à la fois des variables et des caractères spéciaux, après la dernière ligne.
Par exemple, en ajoutant $ NEW_HOST avec $ NEW_IP à / etc / hosts:
Options de sed expliquées:
la source
écho «Bonjour tout le monde» | (sudo tee -a /etc/apt/sources.list)
la source
Que diriez-vous:
écho texte | sudo dd status = none of = privilegedfile
Je veux changer / proc / sys / net / ipv4 / tcp_rmem.
J'ai fait:
sudo dd status = aucun de = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
élimine l'écho avec un document à une seule ligne
la source
Cela a fonctionné pour moi: commande originale
Commande de travail
la source
tee -a
. Justetee
écraser le fichier!Pouvez-vous modifier la propriété du fichier, puis le modifier à nouveau après avoir utilisé
cat >>
pour ajouter?Quelque chose comme ce travail pour vous?
la source