run - sudo in bash script without password
sudo echo “algo”>>/etc/privilegedFile no funciona... ¿hay alguna alternativa? (13)
Esta es una pregunta bastante simple, al menos parece que debería ser, sobre los permisos de sudo en Linux.
Hay muchas veces en las que solo quiero agregar algo a /etc/hosts
o un archivo similar pero no puedo hacerlo porque no se permiten ni >
ni >>
, incluso con root.
¿Hay alguna manera de hacer este trabajo sin tener que su
o sudo su
en la raíz?
¿Puede cambiar la propiedad del archivo y luego volver a cambiarlo después de usar cat >>
para adjuntarlo?
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
¿Algo como este trabajo para ti?
Al usar sed -i con $ a , puede agregar texto, que contiene 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
Explicación de las opciones:
- -i para en el lugar
- $ para la última línea
- una para añadir
El problema es que el shell realiza redirección de salida, no sudo o eco, por lo que esto se hace como usuario habitual.
Pruebe el siguiente fragmento de código:
sudo sh -c "echo ''something'' >> /etc/privilegedfile"
El problema es que es tu shell el que maneja la redirección; está intentando abrir el archivo con sus permisos, no los del proceso que está ejecutando bajo sudo.
Use algo como esto, tal vez:
sudo sh -c "echo ''something'' >> /etc/privilegedFile"
En bash puede usar tee
en combinación con > /dev/null
para mantener la stdout limpia.
echo "# comment" | sudo tee -a /etc/hosts > /dev/null
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
Me gustaría señalar, para los curiosos, que también puede citar un 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"
Obra
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 los suyos, no los del usuario al que está "sudoing".
También puede usar una sponge
del paquete moreutils
y no necesita redirigir la salida (es decir, no hay ruido de tee
para ocultar):
echo ''Add this line'' | sudo sponge -a privfile
Usando la respuesta de Yoo , ponga esto en su ~/.bashrc
:
sudoe() {
[[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
echo "$1" | sudo tee --append "$2" > /dev/null
}
Ahora puede ejecutar sudoe ''deb blah # blah'' /etc/apt/sources.list
Editar:
Una versión más completa que le permite canalizar la entrada o redirigir desde un archivo e incluye un interruptor -a
para desactivar el agregado (que está activado 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
}
Utilice tee --append
o tee -a
.
echo ''deb blah ... blah'' | sudo tee --append /etc/apt/sources.list
Asegúrese de evitar comillas dentro de comillas.
Para evitar volver a imprimir datos en la consola, redirija la salida a / dev / null.
echo ''deb blah ... blah'' | sudo tee --append /etc/apt/sources.list > /dev/null
echo ''Hola Mundo'' | (sudo tee -a /etc/apt/sources.list)
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"