Question Comment ajouter un fichier en tant que sudo?


Duplication possible:
sudo incapable d'écrire dans / etc / profile 

Je veux faire:

echo "something" >> /etc/config_file

Mais, comme seul l'utilisateur root dispose de l'autorisation d'écriture sur ce fichier, je ne peux pas le faire. Mais ce qui suit ne fonctionne pas non plus.

sudo echo "something" >> /etc/config_file

Existe-t-il un moyen d’ajouter à un fichier dans cette situation sans avoir à l’ouvrir au préalable avec un fichier sudo'éditeur puis ajouter le nouveau contenu à la main?


220
2018-05-01 05:50


origine


J'utilise Ubuntu 9.04 et je suis capable d'utiliser sudo pour chaque commande dont j'ai besoin jusqu'à présent. Créer un sous-shell a fonctionné. - Matt Norris
Fortement lié: Redirection de la sortie standard vers un fichier pour lequel vous n'avez pas de permission en écriture(sous Unix et Linux). Faiblement liés: ls avec le chemin du répertoire affiche les fichiers, mais ls avec le modèle de fichier ne fait pas? - Scott


Réponses:


Le bon outil pour la bonne tâche:tee'

tee - read from standard input and write to standard output and files

Donc, votre ligne de commande devient

% echo "output" | sudo tee -a file

L'avantage de tee sur exécuter Bash avec des autorisations administratives est la suivante:

  • Vous n'exécutez pas Bash avec des autorisations d'administration
  • Seule la partie "écriture dans le fichier" s'exécute avec des autorisations avancées
  • Il est beaucoup plus facile de citer une commande complexe

328
2018-05-01 06:25



Sur OS X, seul le tee semble avoir un drapeau -a. - user495470
Debian 8 tee a la -a ajouter un drapeau. - clay
Utilisation echo "output" | sudo tee -a file > /dev/null si vous souhaitez ignorer la sortie de la console. - Moshe Bixenshpaner
Fonctionne bien pour WSL aussi. - kayleeFrye_onDeck


La redirection est exécutée dans le shell actuel. Pour effectuer la redirection avec des privilèges élevés, vous devez exécuter le shell lui-même avec des privilèges élevés:

sudo bash -c "somecommand >> somefile"

38
2018-05-01 05:54





Avoir sudo spawn un sous-shell:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

Dans cet exemple, sudo exécute "sh" avec le reste comme arguments.

(ceci est montré comme exemple dans la page de manuel de sudo)


22
2017-10-13 14:23



La raison en est que c'est votre shell (qui tourne comme vous) qui fait la redirection, pas sudo. Comme vous n'avez pas la permission d'écrire dans le fichier, vous obtenez l'erreur Autorisation refusée. Ce que fait cette réponse est de démarrer un nouveau shell qui s'exécute en tant que root, et est donc capable d'écrire dans le fichier. - Randy Orrison
Ce n'est pas la bonne réponse. C'est une bonne réponse. Akira en a obtenu une meilleure pour la logique fournie dans cette réponse. - TOOGAM


À mon avis, le meilleur dans ce cas est dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

4
2018-04-18 18:03





J'utilise habituellement shell ICI document avec sudo tee -a. Quelque chose du genre:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4
2018-06-16 16:16





Il peut y avoir un problème avec le sudo ici et la redirection. Utilisez plutôt un éditeur de texte de votre choix pour ajouter la ligne.

sudo nano /etc/profile

Ou, vous pouvez essayer su plutôt

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

3
2017-10-13 14:10



Malheureusement, cela a produit le même résultat. - Matt Norris
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' devrait marcher. Comme il n'y a rien, le shell peut se développer par erreur dans l'arg en écho, citation unique de la commande globale. - quack quixote
C'est fantastique. Maintenant, faites cela dans le cadre d'un script. - Ernie Dunbar


Cela ne fonctionnera pas, vous essayez de rediriger (en utilisant >>) la sortie de sudo. Ce que vous voulez vraiment faire, c'est rediriger la sortie de echo. Je vous suggère simplement d'utiliser votre éditeur favori et d'ajouter cette ligne manuellement à /etc/profile. Cela a l'avantage supplémentaire que vous pouvez vérifier si /etc/profile se prépare déjà JAVA_HOME.


0
2017-10-13 14:36





Utilisation ex-façon:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

et remplacer FOO avec votre variable à ajouter.

Dans certains systèmes (tels que OS X), le /etc/profile fichier a 444 autorisations, donc si vous obtenez toujours permission refusée, vérifiez et corrigez d'abord la permission:

sudo chmod 644 /etc/profile

puis réessayez.


0
2018-05-24 22:22