sudo echo & # 8220; quelque chose & # 8221; > > / etc / privilegedFile ne fonctionne pas
-
01-07-2019 - |
Question
C’est une question assez simple, du moins on dirait que ce devrait être le cas, sur les autorisations sudo sous Linux.
Il arrive souvent que je veuille simplement ajouter quelque chose à / etc / hosts
ou à un fichier similaire mais que je ne puisse finalement pas le faire car >
et > >
ne sont pas autorisés, même avec root.
Y at-il un moyen de faire en sorte que cela fonctionne sans avoir à su
ou sudo su
à la racine?
La solution
Utilisez tee --append
ou tee -a
.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list
Veillez à éviter les guillemets entre guillemets.
Pour éviter d'imprimer les données sur la console, redirigez la sortie vers / dev / null.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null
Autres conseils
Le problème est que le shell génère la redirection en sortie, pas sudo ou echo, donc cela se fait comme votre utilisateur habituel.
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 essaie d'ouvrir le fichier avec vos autorisations et non celles du processus que vous exécutez sous sudo.
Utilisez quelque chose comme ceci, peut-être:
sudo sh -c "echo 'something' >> /etc/privilegedFile"
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
Faire
sudo sh -c "echo >> somefile"
devrait fonctionner. Le problème est que > et > > sont manipulés par votre shell, pas par le "sudoed" commande, les autorisations sont donc les vôtres, pas celles de l'utilisateur que vous "Sudoing" dans.
Je ferais remarquer, pour les curieux, que vous pouvez également citer un hérédoc (pour les gros 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"
Sous 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 la réponse de Yoo , mettez ceci dans votre ~ / .bashrc
:
sudoe() {
[[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
echo "$1" | sudo tee --append "$2" > /dev/null
}
Vous pouvez maintenant exécuter sudoe 'deb blah # blah' /etc/apt/sources.list
Modifier:
Une version plus complète qui vous permet de diriger l'entrée dans un fichier ou de le rediriger à partir d'un fichier et inclut un commutateur -a
pour désactiver l'ajout (qui est activé par défaut):
sudoe() {
if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
shift &>/dev/null || local failed=1
else
local append="--append"
fi
while [[ $failed -ne 1 ]]; do
if [[ -t 0 ]]; then
text="$1"; shift &>/dev/null || break
else
text="$(cat <&0)"
fi
[[ -z "$1" ]] && break
echo "$text" | sudo tee $append "$1" >/dev/null; return $?
done
echo "Usage: <*> [-a|--no-append] [text] <file>"; return 1
}
Vous pouvez également utiliser sponge
à partir du package moreutils
sans avoir à rediriger la sortie (c.-à-d., pas de bruit tee
à masquer):
echo 'Add this line' | sudo sponge -a privfile
echo 'Hello World' | (sudo tee -a /etc/apt/sources.list)
Cela a fonctionné pour moi: commande d'origine
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 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
Les options de Sed expliquées:
- -i pour un remplacement sur place
- $ pour la dernière ligne
- un à ajouter
Pouvez-vous modifier la propriété du fichier, puis de nouveau après avoir utilisé cat > >
à ajouter?
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
Quelque chose comme ça marche pour vous?