¿Solicitar contraseña de sudo y elevar privilegios mediante programación en bash script?

49

Actualmente estoy trabajando en un script bash que instala y configura varios programas en un sistema Linux estándar (actualmente, Ubuntu). Debido a que instala programas y copia una cantidad de archivos en varias carpetas que requieren privilegios elevados, ya hice el estándar "Necesito privilegios elevados" y salgo.

Sin embargo, me gustaría, si es posible, poder solicitar al usuario su contraseña de sudo y elevar los privilegios del script automáticamente si el usuario no ejecuta el comando de script con sudo (como iniciarlo desde el administrador de archivos GUI), sin que el usuario tenga que reiniciar el script.

Como está diseñado para ejecutarse en instalaciones de Linux en stock, cualquier opción que modifique el sistema no funcionará para mis propósitos. Todas las opciones deben estar contenidas en el script en sí.

¿Es esto posible dentro de Bash? Si es así, ¿cuál es la mejor manera (segura, pero concisa) de hacer esto?

Shauna
fuente
@MichaelMrozek - Ah, las alegrías de tener tantos sitios de nicho al intentar minimizar la fragmentación. Y ya sabes, el enlace que diste nunca apareció por mí mientras buscaba en Google.
Shauna
@jww te das cuenta de que casi todos esos enlaces fueron consultados aproximadamente 4 años después de este, ¿verdad?
Shauna
1
@Shauna - Supongo que ya has resuelto el problema. Los enlaces son para futuros visitantes.

Respuestas:

64

Corro sudodirectamente desde el script:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Michael Mrozek
fuente
16

Yo sugiero:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done
enzotib
fuente
¿Qué if [[ -t 1 ]];comprueba?
Shauna
Ah ok Supuse que tenía algo que ver con el terminal frente a la GUI, pero no estaba seguro de cuál era la declaración if en sí.
Shauna
Increíble, gracias!
Fire-Dragon-DoL
16

Agregue esto como la primera línea del script:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Cambiar sudoa gksuo gksudosi prefieren un símbolo gráfico.

Kevin
fuente
3
Tenga en cuenta que "$*"va a fusionar todos los argumentos en uno ( /path/to/script one two threeva a resultar en $1ser one two three), y $*sin comillas desordenará los espacios en los argumentos. "$@"funciona bien
Michael Mrozek
@MichaelMrozek Ah, cierto. Ese era el que estaba buscando, Corregido
Kevin
¿Hay alguna manera de hacer esto en Debian, donde parece que no hay un comando sudo?
wrongusername
@wrongusername install sudo, es mucho mejor que usar su. Pero si realmente quieres, probablementeexec su -c "$0" "$@"
Kevin
2

script de ejemplo no me importa compartir ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK

TeK ImPerial. Soluciones
fuente
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- ¡Parece un revestimiento realmente eficiente! ¡Agradable!
groovenectar
¿Tendría sentido usar UID efectivo aquí $EUDI, o siempre el mismo resultado? Por ejemplo,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar