sudo echo "quelque chose"> /etc/privilegedFile ne fonctionne pas... est-il une alternative?
C'est une question assez simple, du moins il semble qu'elle devrait l'être, à propos des permissions sudo dans Linux.
il y a beaucoup de fois où je veux juste ajouter quelque chose à /etc/hosts
ou un fichier similaire, mais je ne peux pas parce que les deux >
et >>
ne sont pas autorisés, même avec root.
y a-t-il un moyen de faire ce travail sans avoir à su
ou sudo su
en racine?
12 réponses
utiliser tee --append
ou tee -a
.
echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list
évitez les guillemets entre guillemets.
pour éviter d'imprimer des données vers la console, redirigez la sortie vers /dev/null.
echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list > /dev/null
le problème est que le shell fait la redirection de sortie, pas sudo ou echo, donc c'est fait en tant qu'Utilisateur régulier.
essayez l'extrait de code suivant:
sudo sh -c "echo 'something' >> /etc/privilegedfile"
le problème est que c'est votre shell qui gère la redirection; il essaye d'ouvrir le fichier avec vos" permissions 151930920 " pas celles du processus que vous exécutez sous sudo.
utilisez quelque chose comme ceci, peut-être:
sudo sh -c "echo 'something' >> /etc/privilegedFile"
Faire
sudo sh -c "echo >> somefile"
devrait marcher. Le problème est que > et >> sont gérés par votre shell, pas par la commande "soudoed", donc les permissions sont les vôtres, pas celles de l'utilisateur dans lequel vous êtes "soudoing".
je voudrais noter, pour les curieux, que vous pouvez également citer un heredoc (pour les grands blocs):
sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<plist version=\"1.0\">
<dict>
<key>Label</key>
<string>com.company.ipfw</string>
<key>Program</key>
<string>/sbin/ipfw</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/ipfw</string>
<string>-q</string>
<string>/etc/ipfw.conf</string>
</array>
<key>RunAtLoad</key>
<true></true>
</dict>
</plist>
EOIPFW"
en bash vous pouvez utiliser tee
en combinaison avec > /dev/null
pour garder stdout propre.
echo "# comment" | sudo tee -a /etc/hosts > /dev/null
en utilisant réponse de Yoo , mettez ceci dans votre ~/.bashrc
:
sudoe() {
[[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
echo "" | sudo tee --append "" > /dev/null
}
Maintenant vous pouvez lancer sudoe 'deb blah # blah' /etc/apt/sources.list
modifier:
une version plus complète qui vous permet de pipe input ou redirect à partir d'un fichier et comprend un commutateur -a
pour désactiver l'ajout (qui est activé par défaut):
sudoe() {
if ([[ "" == "-a" ]] || [[ "" == "--no-append" ]]); then
shift &>/dev/null || local failed=1
else
local append="--append"
fi
while [[ $failed -ne 1 ]]; do
if [[ -t 0 ]]; then
text=""; shift &>/dev/null || break
else
text="$(cat <&0)"
fi
[[ -z "" ]] && break
echo "$text" | sudo tee $append "" >/dev/null; return $?
done
echo "Usage: "151910920" [-a|--no-append] [text] <file>"; return 1
}
vous pouvez également utiliser sponge
du paquet moreutils
et ne pas avoir besoin de rediriger la sortie (i.e., pas de tee
bruit à cacher):
echo 'Add this line' | sudo sponge -a privfile
ça a marché pour moi: commande originale
echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment
commande de travail
echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment
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, ajouter $NEW_HOST avec $NEW_IP à/etc / hosts:
sudo sed -i "$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts
sed options expliqué:
- -j' pour
- $ pour la dernière ligne
- un append
pouvez-vous changer la propriété du fichier puis le changer de nouveau après avoir utilisé cat >>
pour ajouter?
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
quelque chose comme ça marche pour toi?