Richiedi il privilegio di root all'interno di uno script

23

Ho uno script che può essere eseguito come sudo script.sh o pkexec script.sh

Sarebbe molto più bello dal punto di vista dell'utente se lo script chiedesse la password all'utente quando lo sta eseguendo solo per nome script.sh .

Come posso "incorporare" la richiesta a pkexec o sudo per eseguire l'intero script con il privilegio di root?

Nota che l'esecuzione di tutto con sudo sh -c potrebbe non essere la soluzione migliore in quanto ho funzioni nello script.

    
posta Sergiy Kolodyazhnyy 15.03.2016 - 16:38

6 risposte

49

Funzionerà:

echo "$(whoami)"

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

Esempio:

./test.sh 
blade
[sudo] password for blade: 
root
    
risposta data blade19899 15.03.2016 - 16:40
12

Se desideri un bel dialogo, prova qualcosa di simile. L'ho estratto da qualcos'altro che ho scritto, quindi ha cose extra che potresti non aver bisogno o che vuoi, ma mostra l'idea generale:

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

Questo utilizza whiptail, che puoi installare se non lo hai già fatto:

sudo apt-get install whiptail
    
risposta data Michael Hampton 16.03.2016 - 04:49
11

La risposta di blade19899 è davvero la strada da percorrere, tuttavia si potrebbe anche chiamare sudo bash nello shebang:

#!/usr/bin/sudo bash
# ...

L'ovvia avvertenza è che funzionerà solo finché lo script viene chiamato con ./script e fallirà non appena lo script viene chiamato con bash script .

    
risposta data kos 15.03.2016 - 17:28
6

Presento i comandi all'interno dello script che richiedono l'accesso root con sudo - se l'utente non ha già acquisito le autorizzazioni, lo script richiede una password a quel punto.

Esempio

#!/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

Questo script può essere eseguito come sudo <scriptname> o come <scriptname> . In entrambi i casi chiederà la password, solo una volta.

    
risposta data Charles Green 15.03.2016 - 16:51
3

Sembra che nessun altro abbia affrontato l'ovvia preoccupazione qui. Mettendo sudo nello script che poi distribuisci promuove le cattive abitudini dell'utente . (Suppongo che tu lo stia distribuendo perché dici "dal punto di vista dell'utente".)

La verità è che c'è una linea guida nell'uso di applicazioni e script che è simile al principio di sicurezza nel settore bancario di: Non fornire mai le tue informazioni personali a qualcuno che ti chiama e dice che stanno chiamando "dal tuo bank " e che esiste per ragioni simili.

La regola per le applicazioni è:

Non inserire mai la tua password quando ti viene richiesto, a meno che tu non sia certo che cosa si stia facendo. Questo si applica a chiunque abbia accesso sudo .

Se stai digitando la tua password perché hai eseguito sudo sulla riga di comando, ottimo. Se stai digitando perché hai eseguito un comando SSH, bene. Se lo stai digitando quando accedi al tuo computer, ottimo, naturalmente.

Se si esegue uno script o un eseguibile straniero e si immette la password in modo corretto quando richiesto, è nessuna idea ciò che lo script sta facendo con esso. Potrebbe essere conservato in un file temporaneo in testo semplice, per quanto ne sai tu, e potrebbe anche non riuscire a ripulire se stesso.

Ovviamente ci sono preoccupazioni separate e aggiuntive sull'esecuzione di un set di comandi sconosciuto come root , ma quello di cui sto parlando qui è mantenere la sicurezza sulla password stessa . Anche supponendo che l'applicazione / script non sia dannoso, si desidera comunque che la password venga gestita in modo sicuro per impedire a altre applicazioni di accedervi e utilizzarla maliziosamente.

Quindi, la mia risposta personale a questo è, la cosa migliore da inserire nello script se ha bisogno dei privilegi di root è:

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

# do privileged stuff, etc.
    
risposta data Wildcard 21.03.2016 - 02:28
1

L'ho fatto in questo modo:

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

echo $pass | sudo -S [your command here]
    
risposta data 88weighed 19.03.2016 - 10:32

Leggi altre domande sui tag