web-dev-qa-db-fra.com

Comment insérer du texte dans un fichier appartenant à une racine à l'aide de sudo?

Dupliquer possible:
[.____] Redirection de stdout à un fichier que vous n'avez pas d'autorisation d'écriture

Exécuter une commande comme Sudo echo 'text' >> /file.txt échoue avec:

bash: /file.txt: Permission denied
48
tshepang

Cela ne fonctionne pas car la redirection est exécutée par la coquille, non par la commande qui s'applique à. Mais votre coquille ne fonctionne pas en tant que root, seulement echo 'text' est.

Une astuce commune lorsque vous devez avoir des autorisations root pour écrire dans un fichier, mais pour ne pas générer les données, est d'utiliser tee:

echo 'text' | Sudo tee -a /file.txt

tee imprime également le texte sur stdout. Afin de le mettre en sourdine, il se comporte plus semblable à la coque ajoutée (>>), acheminez le stdout pour /dev/null:

echo 'text' | Sudo tee -a /file.txt > /dev/null

Si vous avez besoin d'autorisations de racine pour générer les données, vous pouvez exécuter deux commandes distinctes Sudo ou exécuter une coque à l'intérieur Sudo et faire la redirection là-bas (prudent avec la citation).

Sudo echo 'text' | Sudo tee -a /file.txt
Sudo sh -c 'echo "text" >>/file.txt'

Lorsque vous écrasez plutôt que d'ajouter, si vous êtes habitué à votre shell refusant de tronquer un fichier existant avec le > Opérateur (set -o noclobber), rappelez-vous que cette protection ne s'appliquera pas. Sudo sh -c 'echo >/etc/passwd' et Sudo tee /etc/passwd écrasera /etc/passwd, vous auriez besoin de Sudo sh -o noclobber -c 'echo >/etc/passwd' pour ce paramètre noclobber doit également être appliqué sur sh commencé par Sudo.

Vous indiquez bash d'ouvrir un fichier et d'ajouter la sortie de la commande Sudo echo 'text' Pour cela, ce qui ne fonctionne bien sûr pas depuis que votre bash fonctionne comme une non-racine. Interactivement, je gère habituellement Sudo -s Pour contourner cela (puisque la coquille fonctionne en tant que root et peut ouvrir le fichier). Alternativement, vous pouvez courir Sudo sh -c "echo 'text' >> /file.txt", qui fonctionne également, mais est un peu tracas avec toute l'interpolation/l'échappée qui peut interférer si vous avez des expressions compliquées.

8
Thomas Themel