web-dev-qa-db-fra.com

Comment ajouter un fichier en tant que sudo?

Je veux faire:

echo "something" >> /etc/config_file

Mais, étant donné que seul l'utilisateur root a 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 à un fichier dans cette situation sans avoir à l'ouvrir au préalable avec un éditeur Sudo 'd, puis à l'ajout manuel du nouveau contenu?

257
hsribei

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 l’exécution de Bash avec des autorisations administratives est le suivant:

  • Vous n'exécutez pas Bash avec des autorisations administratives
  • Seule la partie 'write to file' s'exécute avec des autorisations avancées
  • Citer une commande complexe est beaucoup plus facile
372
akira

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"

Est-ce que Sudo génère 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 présenté à titre d'exemple dans la page de manuel Sudo)

26
Doug Harris

J'utilise habituellement le document Shell ICI avec Sudo tee -a . Quelque chose dans le genre de:

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
6
Nicholas Sushkin

À 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
user316693

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 le su à la place

su
echo ‘Java_HOME=/usr/lib/jvm/Java-6-Sun’ >> /etc/profile
exit
3
Bobby

Utilisez ex - moyen:

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

et remplacez FOO par votre variable à ajouter.

Sur certains systèmes (tels que OS X), le fichier /etc/profile dispose de 444 autorisations. Par conséquent, si vous obtenez toujours autorisation refusée , commencez par vérifier et corriger l'autorisation:

Sudo chmod 644 /etc/profile

puis réessayez.

0
kenorb

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

0
innaM