sudo echo “algo” >> /etc/privilegedFile no funciona
-
01-07-2019 - |
Pregunta
Esta es una pregunta bastante simple, al menos parece que debería serlo, sobre los permisos sudo en Linux.
Hay muchas ocasiones en las que solo quiero agregar algo a /etc/hosts
o un archivo similar pero al final no puedo porque ambos >
y >>
no están permitidos, ni siquiera con root.
¿Hay alguna manera de hacer que esto funcione sin tener que hacerlo? su
o sudo su
en raíz?
Solución
Usar tee --append
o tee -a
.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list
Asegúrese de evitar las comillas entre comillas.
Para evitar imprimir datos en la consola, redirija la salida a /dev/null.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null
Otros consejos
El problema es que el shell genera redirección, no sudo o echo, por lo que esto se hace como su usuario habitual.
Pruebe el siguiente fragmento de código:
sudo sh -c "echo 'something' >> /etc/privilegedfile"
El problema es que es su shell el que maneja la redirección;está intentando abrir el archivo con su permisos, no los del proceso que estás ejecutando en sudo.
Utilice algo como esto, tal vez:
sudo sh -c "echo 'something' >> /etc/privilegedFile"
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
Haciendo
sudo sh -c "echo >> somefile"
Deberia trabajar.El problema es que > y >> son manejados por su shell, no por el comando "sudoed", por lo que los permisos son suyos, no los del usuario al que está "sudoando".
Me gustaría señalar, para los curiosos, que también pueden citar un documento heredoc (para bloques grandes):
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 puedes usar tee
en combinación con > /dev/null
para mantener limpio el estándar.
echo "# comment" | sudo tee -a /etc/hosts > /dev/null
Usando la respuesta de yoo, pon esto en tu ~/.bashrc
:
sudoe() {
[[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
echo "$1" | sudo tee --append "$2" > /dev/null
}
Ahora puedes correr sudoe 'deb blah # blah' /etc/apt/sources.list
Editar:
Una versión más completa que le permite canalizar entradas o redirigir desde un archivo e incluye una -a
cambie para desactivar la adición (que está activada de forma predeterminada):
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
}
También puedes usar sponge
desde el moreutils
paquete y no es necesario redirigir la salida (es decir, no tee
ruido para ocultar):
echo 'Add this line' | sudo sponge -a privfile
Echo 'Hello World' | (sudo tee -a /etc/apt/sources.list)
Esto funcionó para mí:comando original
echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment
comando de trabajo
echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment
Mediante el uso sed -i con $ un , puede agregar texto que contenga variables y caracteres especiales después de la última línea.
Por ejemplo, agregando $NEW_HOST con $NEW_IP a /etc/hosts:
sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts
Opciones sed explicadas:
- -i para en el lugar
- $ para la última línea
- a para agregar
¿Puedes cambiar la propiedad del archivo y luego volver a cambiarlo después de usarlo? cat >>
¿para anexar?
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
¿Algo como esto te funciona?