Esegui parte di uno script bash come un altro utente


Risposte:


42

Utilizzare il comando sudo nello script.

Nella forma:

sudo -u username command

il comando sudo esegue il comando come nome utente utente .

Se lo script viene eseguito come root, non credo che richiederà una password. Altrimenti, in questo articolo viene illustrato come utilizzare sudo con password in una riga di comando? e in questo articolo viene illustrato come utilizzare sudo senza password?


5
Questo è facile e facile, ma c'è un modo per farlo per un gruppo di comandi anziché uno alla volta?
Andrew,

scrivere uno script bash, renderlo eseguibile chmod +x script.she poi solosudo -u username script.sh
NiCU,

@Andrew Me lo stavo chiedendo io stesso e quanto segue ha funzionato per me: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell,

Includi anche l' iopzione se desideri acquisire l'ambiente dell'utente
neoDev

6

Questa risposta è buona, ma il consiglio di serverfault è leggermente pericoloso - consentirebbe a chiunque di eseguire qualsiasi cosa come root! Quindi sto postando qui perché non riesco a formattare il commento.

Consiglierei di usare visudo per fornire le autorizzazioni necessarie nel modo più preciso possibile. Digita visudoe aggiungi una riga come:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Se è necessario eseguire la stessa cosa su molti host, è possibile aprirlo con:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Ma non ** uso * neanche:

username ALL=(ALL) NOPASSWD: ALL

o nome utente hostname = ALL

La pagina man sudoer ha molti dettagli cruenti


Funzionerebbe per un comando disponibile solo per un determinato utente?
Manish Mathai

È possibile specificare che solo determinati utenti possono eseguire il comando (negli esempi precedenti, sostituire usernamecon il nome utente che dovrebbe essere in grado di eseguire il comando). Se l'eseguibile che vuoi eseguire è eseguibile solo da un determinato utente, va bene lo stesso: passa quel nome utente nella sudo -u username commandlineriga dello script.
James Polley,

@Manish. Sì. Quello che dice il file sudoers è "Consenti a questo nome utente su questo host di eseguire command1 senza dover fornire una password.
DaveParillo

6

# I = like:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./correre

1: root
2: nobody
3: root

10
Potresti aggiungere del testo esplicativo?
Kazark,

4

Per sonarqube:

sudo -u sonar /usr/bin/sonar start

dove sonarè il nome dell'utente utilizzato per eseguire il comando/usr/bin/sonar start


2

non ne sono così sicuro, ma se si desidera che SOLO la fine di quello script verrà eseguita come un altro utente, è possibile aggiungere su someuserprima della fine dello script.

Mi sto perdendo qualcosa?

Spero che sia d'aiuto,

Saluti


1
Penso che questa sia la risposta più appropriata, avendo tutte le altre risposte che suggeriscono sudo, che spesso non è installato di default su alcune installazioni Linux minime.
Tim

1

In questo modo, la fine di uno script verrà eseguita da un altro utente (root). Si prega di notare il $[LINENO+2]e exit $?chiama. Questi sono necessari per eseguire la fine dello script una sola volta e per preservare il codice di uscita della sudochiamata.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
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.