Se eseguo un file di script Bash sudo, anche tutti i comandi all'interno dello script Bash verranno eseguiti come sudo?


30

Voglio scrivere uno script post-installazione automatizzato in Bash (chiamato post-install.sh, ad esempio). Lo script aggiungerà e aggiornerà automaticamente i repository, installerà e aggiornerà i pacchetti, modificherà i file di configurazione, ecc.

Ora, se eseguo questo script, ad esempio con sudo post-install.sh, mi verrà richiesta una sudopassword una volta sola o dovrò inserire la sudopassword per ogni invocazione di un comando all'interno dello script, che necessita di sudoautorizzazione? In altre parole, i comandi all'interno dello script bash 'ereditano' le autorizzazioni di esecuzione, per così dire?

E, se davvero fanno , c'è ancora una possibilità che le sudoautorizzazioni verranno timeout (se, ad esempio, un particolare comando prende il tempo necessario per superare il sudotimeout)? O l' sudoingresso della password iniziale durerà per l'intera durata dell'intero script?


4
Potresti essere interessato a provare alcuni strumenti appositamente progettati per questa attività. 3 comuni sono: Puppet, Chef e Ancible.
spuder,

@spuder, e per un'architettura di livello enterprise su larga scala e la sicurezza della tua gestione della configurazione, puoi usare CFEngine 3. (Non per i deboli di cuore, né per i comandi una tantum.)
Wildcard

Risposte:


38

D # 1: Mi verrà richiesta una password sudo solo una volta o dovrò inserire la password sudo per ogni invocazione di un comando all'interno dello script, che necessita dell'autorizzazione sudo?

Sì, una volta per la durata dell'esecuzione del tuo script.

NOTA: quando si forniscono le credenziali a sudo, l'autenticazione è in genere valida per 5 minuti all'interno della shell in cui è stata immessa la password. Inoltre, anche tutti i processi figlio che vengono eseguiti da questa shell o qualsiasi script eseguito nella shell (il tuo caso) verranno eseguiti a livello elevato.

D # 2: esiste ancora la possibilità che le autorizzazioni sudo scadano (se, ad esempio, un determinato comando impiega abbastanza tempo per superare il timeout sudo)? O l'ingresso iniziale della password sudo durerà per l'intera durata dell'intero script?

No, non scadranno nello script. Solo se li stavi digitando in modo interattivo all'interno della shell in cui venivano fornite le credenziali. Ogni volta che sudoviene eseguito all'interno di questa shell, il timeout viene ripristinato. Ma nel tuo caso le loro credenziali rimarranno finché lo script eseguirà ed eseguirà i comandi al suo interno.

estratto dalla pagina man di sudo

Questo limite è specifico della politica; il timeout di richiesta password predefinito per la politica di sicurezza sudoers è di 5 minuti.


1
La risposta a Q1 è "No, non ti verrà più richiesto."
dannysauer,

@dannysauer - leggi di nuovo la sua Q. Sto dicendo Sì per aver richiesto la password una sola volta!
slm

La domanda dice "è a o b" e solo dire "si" non ha chiarito se si trattasse di "si, a" o "si, b". Sto solo cercando di chiarire le cose per i futuri lettori. : D
dannysauer,

@dannysauer - vedi aggiornamento.
slm

1
Questa nuova domanda sarebbe questa: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>dovrebbe funzionare.
Gauthier,

17

bashe tutti i suoi processi figlio verranno eseguiti con autorizzazioni di superutente. Quindi non dovrai reinserire una password per i comandi nel tuo script bash.

Il sudotimeout si applica solo alla (successiva) chiamata separata di sudo. Non influirebbe sul processo bash già in esecuzione o su nessuno dei suoi discendenti.


3

Queste risposte sono probabilmente tutte corrette. Tuttavia, questo non è il modo generalmente usato (per quanto ne so) di creare script bash che richiedono sudoautorizzazioni. Generalmente, nella parte superiore dello script supponi che non sia stato eseguito con sudoautorizzazioni e invece sudo -vti chiami (che richiederà all'utente la password) per "impostare" una sudo"sessione". È possibile o un echopo 'di testo esplicativo prima del prompt o sovrascrivere sudoil proprio prompt con l' -pinterruttore, per far sapere all'utente che è necessario l' sudoaccesso per alcuni comandi.

Quindi, nel tuo script, dovresti andare a chiamare sudoi comandi che lo richiedono (e solo quei comandi che lo richiedono) senza ulteriori richieste di password. Se ritieni che un determinato gruppo di comandi eseguiti insieme nel tuo script (indipendentemente dal loro uso di sudo) si estenda oltre il timeout di sudo, puoi chiamare sudo -vnel mezzo per emettere una sorta di 'keep-alive' la sudo'sessione '.

Se la sudo'sessione' dovesse scadere durante lo script, all'utente verrà semplicemente richiesta la password la prossima volta che si emette un comando sudo nello script.


1
Supponiamo che uno dei passaggi dello script sia la creazione di un kernel Linux completamente nuovo, che può richiedere due ore. Mantenere viva la sessione potrebbe essere una sfida, come hai affrontato questo?
Gauthier,

Non puoi. Ma la prossima volta che sudo -vlo chiedi chiederà di nuovo all'utente la password. Non è il peggior problema secondo me. Forse per essere utile, rendere l'utente consapevole del meccanismo potrebbe essere utile.
alexrussell,

L'inverso di ciò è richiedere all'utente di chiamare lo script con sudo per le altre risposte e quindi sudo -u $SUDO_USERdi far funzionare tutti i comandi che non richiedono root senza elevazione. Purtroppo aggiunge più codice, ma è l'unico modo affidabile per eseguire operazioni di root in un processo di lunga durata.
dragon788,

Credo che dovrebbe chiarire, un altro modo per farlo sarebbe quello di chiamare sudo una volta all'inizio dello script di mettere un file temporaneo in /etc/sudoers.duso visudo -c -f /tmp/tempsudoersper garantire il file è valida prima di copiarlo in posizione, e quindi rimuovere il file una volta fatto (utilizzando una trap all'uscita / errore per garantire che l'escalation non possa essere abusata). L'implementazione più sicura consentirebbe all'utente di eseguire i comandi specifici nel tuo script con argomenti specifici senza una password utilizzando NOPASSWDmemorizzando ogni comando / argomento in un array per creare il file.
dragon788,

Un po 'tardi tornando a @Gauthier qui, ma sembrerebbe che mi sbagliassi quando ho detto che non puoi mantenere sudoviva una sessione se una determinata singola attività richiede più tempo del timeout. Mi sono imbattuto in questa tecnica l'altro giorno nel repository dotfiles di Mathias Bynens: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.