Ho uno script bash lungo e di lunga durata in cui una manciata di comandi deve essere eseguita come root mentre la maggior parte dei comandi deve essere eseguita come utente normale prima di sudo, perché rovinerebbe la proprietà dei file e simili.
Ho escogitato alcuni metodi, ma ognuno di essi ha dei problemi
Metodo 1: utilizzo di sudo all'interno del file
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Questo sembrerebbe buono, dal modo in cui è scritto il codice. sudo
viene scritto prima delle poche istruzioni che devono essere effettivamente eseguite dal root, ma se l'intervallo tra ogni sudo
chiamata è troppo lungo sudo
richiede nuovamente una password. Inoltre, se la prima esecuzione di sudo
non riesce, ad esempio a causa di una password non valida, il resto dello script viene comunque eseguito.
Metodo 2: usare sudo per chiamare il file e poi tornare all'utente originale quando necessario
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Anche questo fa schifo, perché devo aggiungere su username -c
davanti a quasi ogni riga. Anche trovare il nome utente originale dopo sudo
è possibile, ma ingombrante.
Esiste un modo migliore?
Modifica: ho pubblicato qui solo piccoli script senza senso per mostrare di cosa sto parlando. Nello script attuale ho alcune linee che richiedono sudo (avvio e arresto dei servizi), alcune linee in cui non importa se c'è sudo e molte linee che devono essere effettivamente eseguite senza sudo.
man sudo
? -v, --validate
'Aggiorna le credenziali memorizzate nella cache dell'utente, autenticando l'utente se necessario. Per il plug-in sudoers, questo estende il timeout sudo per altri 15 minuti per impostazione predefinita, ma non esegue un comando. Non tutte le politiche di sicurezza supportano le credenziali memorizzate nella cache. " (Se lo esegui abbastanza spesso, l'autenticazione sudo non dovrebbe
sudo
se deve disporre di autorizzazioni elevate. Ma non ha senso passaresu username -c
a eseguire unecho
. In altre parole, questo sembra un [XY]. Potresti modificare e spiegare cosa farà effettivamente il tuo script e perché ritieni di dover cambiare utente così spesso?