C’est une question assez simple, du moins on dirait que cela devrait être le cas, à propos des autorisations Sudo sous Linux.
Il arrive souvent que je veuille simplement ajouter quelque chose à /etc/hosts
ou à un fichier similaire, sans pouvoir le faire car >
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?
Utilisez tee --append
ou tee -a
.
echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list
Assurez-vous d'éviter les guillemets à l'intérieur des 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
N'oubliez pas le drapeau (-a
/--append
)! Juste tee
fonctionne comme >
et écrasera votre fichier. tee -a
fonctionne comme >>
et écrit à la fin du fichier.
Le problème est que le shell génère la redirection en sortie, pas Sudo ou echo, donc cela se 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 essaie d'ouvrir le fichier avec les autorisations votre 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 marcher. Le problème est que> et >> sont gérés par votre Shell, et non par la commande "sudoed", de sorte que les autorisations vous appartiennent et non celles de l'utilisateur que vous "subissez".
Je ferais remarquer, pour les curieux, que vous pouvez aussi 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"
En bash, vous pouvez utiliser tee
en combinaison avec > /dev/null
pour maintenir 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
}
Maintenant vous pouvez lancer sudoe 'deb blah # blah' /etc/apt/sources.list
Modifier:
Une version plus complète qui vous permet de diriger l'entrée ou la redirection à 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: $0 [-a|--no-append] [text] <file>"; return 1
}
Vous pouvez également utiliser sponge
à partir du package moreutils
sans avoir besoin de rediriger la sortie (c'est-à-dire, pas de bruit tee
à masquer):
echo 'Add this line' | Sudo sponge -a privfile
Que diriez-vous:
echo text | Sudo dd status = aucun de = fichier privilégié
Je souhaite modifier/proc/sys/net/ipv4/tcp_rmem.
J'ai fait:
Sudo dd status = aucun de =/proc/sys/net/ipv4/tcp_rmem <<< "4096 131072 1024000"
élimine l'écho avec un document d'une seule ligne
echo 'Hello World' | (Sudo tee -a /etc/apt/sources.list)
En utilisant sed -i avec $ a, vous pouvez ajouter du texte contenant les deux variables et 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
options sed expliquées: