it-swarm-es.tech

Solicitar privilegios de root desde un script

Tengo un script que puede ejecutarse como Sudo script.sh o pkexec script.sh

Sería mucho mejor desde el punto de vista del usuario si el script solicitara la contraseña del usuario cuando solo la ejecutara con el nombre script.sh.

¿Cómo puedo "incrustar" la solicitud a pkexec o Sudo para ejecutar todo el script con privilegio de root?

Nota que ejecutar todo con Sudo sh -c podría no ser la mejor solución ya que tengo funciones en el script.

23

Esto funcionará:

echo "$(whoami)"

[ "$UID" -eq 0 ] || exec Sudo "$0" "[email protected]"

ejemplo:

./test.sh 
blade
[Sudo] password for blade: 
root
52
blade19899

Si desea un bonito diálogo, intente algo como esto. Extraje esto directamente de otra cosa que escribí, por lo que tiene cosas adicionales que quizás no necesite o desee, pero muestra la idea general:

brand="My Software"

# Check that the script is running as root. If not, then Prompt for the Sudo
# password and re-execute this script with Sudo.
if [ "$(id -nu)" != "root" ]; then
    Sudo -k
    pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[Sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-)
    exec Sudo -S -p '' "$0" "[email protected]" <<< "$pass"
    exit 1
fi

Sudo dialog

Esto usa whiptail, que puede instalar si aún no lo tiene:

Sudo apt-get install whiptail
12
Michael Hampton

la respuesta de blade19899 es el camino a seguir, sin embargo, también se podría llamar Sudo bash en el Shebang:

#!/usr/bin/Sudo bash
# ...

La advertencia obvia es que esto solo funcionará mientras se llame al script con ./script y fallará tan pronto como se llame al script con bash script.

11
kos

Prefacio los comandos dentro del script que necesitan acceso raíz con Sudo - si el usuario aún no ha obtenido los permisos, el script solicita una contraseña en ese punto.

ejemplo

#!/bin/sh 
mem=$(free  | awk '/Mem:/ {print $4}')
swap=$(free | awk '/Swap:/ {print $3}')

if [ $mem -lt $swap ]; then
    echo "ERROR: not enough RAM to write swap back, nothing done" >&2
    exit 1
fi

Sudo swapoff -a && 
Sudo swapon -a

Este script puede ejecutarse como Sudo <scriptname> o como <scriptname>. En cualquier caso, le pedirá la contraseña, solo una vez.

6
Charles Green

Parece que nadie más ha abordado la preocupación obvia aquí. Poniendo Sudo dentro de tu script que luego distribuyes promueve malos hábitos de usuario. (Supongo que lo está distribuyendo porque menciona "desde el punto de vista del usuario").

La verdad es que hay una directriz en el uso de aplicaciones y scripts que es similar al principio de seguridad en la banca de: Nunca des tu información personal a alguien que te llame y diga que están llamando. "de su banco" , y que existe por razones similares.

La regla para las aplicaciones es:

Nunca escriba su contraseña cuando se le solicite a menos que esté seguro de lo que se está haciendo con ella. Esto se aplica por triplicado a cualquier persona con Sudo acceso.

Si está escribiendo su contraseña porque ejecutó Sudo en la línea de comando, genial. Si lo está escribiendo porque ejecutó un comando SSH, está bien. Si lo está escribiendo cuando inicia sesión en su computadora, genial, por supuesto.

Si solo ejecuta un script o ejecutable extranjero e ingresa su contraseña cuando se le solicite, no tiene ninguna idea de lo que el script está haciendo con él. Podría estar almacenándolo en un archivo temporal en texto plano, por lo que sabes, e incluso podría fallar al limpiarlo.

Obviamente, existen preocupaciones separadas y adicionales sobre la ejecución de un conjunto desconocido de comandos como root, pero de lo que estoy hablando aquí es de mantener la seguridad en la contraseña en sí . Incluso suponiendo que la aplicación/script no sea malicioso, aún desea que su contraseña se maneje de forma segura para evitar que otras aplicaciones la consigan y la usen maliciosamente .

Entonces, mi propia respuesta personal a esto es que lo mejor que puede incluir en su script si necesita privilegios de root es:

#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}

# do privileged stuff, etc.
4
Wildcard

Lo hice de esta manera:

echo -n "Enter password for Sudo rights: "
read -s pass

echo $pass | Sudo -S [your command here]
1
88weighed