without with script run password one bash shell scripting permissions sudo

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"