Esegui solo parti di uno script come sudo, inserendo la password una sola volta


14

Sto scrivendo uno script (in realtà una combinazione di script e makefile) che installa dipendenze esterne: alcuni apt-getcomandi, alcuni gitclonazione, costruzione, installazione, aggiunta di utenti a gruppi, ...

Alcune delle operazioni in questi script richiedono autorizzazioni di superutente, altre no.

Fino ad ora ho eseguito l'intero processo di creazione con sudo, ma presenta alcuni svantaggi:

  • gitrepository Clone get rootcome proprietario, il che significa che non posso modificarli in seguito senza sudoochown
  • gli script che aggiungono utenti ai gruppi non sanno quale utente aggiungere poiché whoamirestituisceroot

Qual è il modo migliore di eseguire come superutente solo i comandi che lo richiedono? Idealmente, il processo richiederebbe comunque di inserire la mia sudopassword, ma solo una volta all'inizio del processo di installazione. Lo dimenticherebbe alla fine, ma lo manterrà per tutto il tempo fino a quel momento (può richiedere diverse ore).

Le soluzioni che ho trovato online includono:

  • sudo -vall'inizio del copione, ma se capisco correttamente questo timeout. La mia sceneggiatura potrebbe durare un paio d'ore
  • eseguendo lo script con sudo, ma i comandi che non richiedono superutente con sudo -u $(logname) <command>. Questo è quello che faccio ora, ma sembra che dovrebbe essere il contrario.

Idealmente, vorrei che la mia sceneggiatura:

  1. richiedere le credenziali del superutente
  2. eseguire i normali comandi come l'utente che ha effettuato l'accesso
  3. eseguire i comandi sudo con le credenziali immesse al passaggio 1
  4. sudo -k per chiudere la sessione del superutente

2
Puoi comunque eseguire tutto come sudo e il tuo script può controllare la SUDO_USERvariabile di ambiente. Se presente, conterrà il nome utente dell'utente che invoca sudo. Quindi puoi (come root) chown $ SUDO_USER: $ SUDO_GID $ your_files. Allo stesso modo, puoi controllare queste variabili in modo che i tuoi comandi adduser sappiano quale utente aggiungere.
Roadmr,

... oppure esegui tutto come root e usa su $SUDO_USER -c commandi comandi come normali utenti.
Rmano,

Risposte:


7

Poiché hai accesso sudodo, crea un file sudoers per te, quindi eliminalo al termine dello script:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

2

Un modo, che generalmente non consiglierei, è leggere tu stesso la password e utilizzare sudol' -Sopzione per passare la password come e quando necessario:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

Da man sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.

1
È sicuro? echo "$password"??
αғsнιη,

@KasiyA echo "$password"non lo sarebbe, ma heredocs e herestrings sono leggermente più sicuri. Non sono visibili sulla riga di comando mostrata dai soliti strumenti.
muru

1
Penso, a rigor di termini, echo "$password"sul lato sinistro di una pipe sia al sicuro in uno script bash. echoè una shell incorporata; /bin/echonon funziona quando viene chiamato semplicemente echo .... Alcune altre shell hanno un echobuiltin ( dash, ad esempio), ma non è necessario che le shell in stile Bourne ne abbiano uno. Quindi penso che echo "$password" |sia accettabile in bash ma potrebbe essere evitato nel caso in cui qualcuno porti lo script su un'altra shell senza accorgersene. Uso uno non portatile [[anziché [in quello script per evitare lo stesso tipo di problema. @KasiyA
Eliah Kagan
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.