Quanto segue è per il caso in cui si desidera eseguire un comando senza password solo se ha un set specifico di opzioni, in cui una parte delle opzioni è variabile . AFAIK non è possibile utilizzare variabili o intervalli di valori nelle dichiarazioni dei sudoers, ovvero è possibile consentire l'accesso in modo esplicito command option1
ma non command option2
utilizzando:
user_name ALL=(root) /usr/bin/command option1
ma se la struttura è command option1 value1
, dove value1
può variare, è necessario disporre di righe esplicite sudoers per ogni possibile valore di value1
. Lo script Shell fornisce un modo per aggirarlo.
Questa risposta è stata ispirata dalla risposta di M. Ahmad Zafar e risolve lì il problema di sicurezza.
- Creare uno script shell in cui si chiama il comando senza
sudo
.
- Salvare lo script in una cartella con privilegi di root (ad es.
/usr/local/bin/
), Rendere il file di proprietà root (ad es. chown root:wheel /usr/local/bin/script_name
) Senza accesso in scrittura per altri (ad es chmod 755 /usr/local/bin/script_name
.).
Aggiungi l'eccezione ai sudoers usando visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Esegui la tua sceneggiatura sudo script_name
.
Ad esempio, voglio cambiare il timeout di sospensione della visualizzazione su macOS. Questo viene fatto usando:
sudo pmset displaysleep time_in_minutes
Considero cambiare il timeout di sospensione un'azione innocente che non giustifica la seccatura della digitazione della password, ma pmset
può fare molte cose e mi piacerebbe tenere queste altre cose dietro la password sudo.
Quindi ho il seguente script su /usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
Alla fine del sudoers
file ho la seguente riga:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Per impostare il timeout a 3 minuti, eseguo il mio script dall'account utente normale user_name
:
sudo ds 3
PS La maggior parte del mio script è la convalida dell'input, che non è obbligatorio, quindi anche i seguenti funzionerebbero:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
fosse uno script Python?