come passare la variabile d'ambiente a sudo su


Risposte:


39

Puoi farlo senza chiamare la shell di accesso:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

o:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

L' -popzione di sucomando preserva le variabili di ambiente.


3
Penso che "-E" preservi le variabili di ambiente sudo.ws/man/sudo.man.html
Andy,

1
@Andy Ma è spesso vietato dalla configurazione sudo.
Gilles 'SO- smetti di essere malvagio'

@cuonglm - grazie. Questo funziona Non avrei dovuto chiamare la shell di accesso.
Umang,

1
@kenorb: No, -pè un'opzione su, non sudoin questo caso
cuonglm,

Ci sono altri thread che dicono -mpreserva la variabile, altri dicono -cqual è la differenza? E uno dei commenti in questi giorni di risposta -E stackoverflow.com/questions/10488758/…
Vishrant

49

Consiglio del professionista: non c'è mai un buon motivo per correresudo su . Per eseguire un comando come un altro utente, utilizzare sudo -u username command. Se si desidera una shell di root, eseguire sudo -io sudo -l. Se hai attivato l'account di root, puoi anche eseguire suda solo, ma sudo sunon è utile. E sì, so che lo vedi dappertutto.

Detto questo, sudoha l' -Einterruttore che preserverà l'ambiente della sessione dell'utente:

 -E, --preserve-env
        Indicates to the security policy that the user wishes to preserve 
        their existing environment variables.  The security policy may
        return an error if the user does not have permission to 
        preserve the environment.

Quindi, dovrai prima esportare la tua variabile, quindi eseguire sudo -E:

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

Non bash -cè necessario. Tuttavia, se eseguo sudo -Eu bob echo "$DUMMY", la variabile viene espansa prima dell'avvio della shell di root, quindi non dimostra che il comando funzioni effettivamente:

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy

2
Un modo migliore per preservare una variabile di ambiente è aggiungerlo a env_keepin sudoers. Forse come questo: Defaults env_keep += "DUMMY".
lcd047

@ lcd047 ma ciò preserverà l'ambiente per tutte le invocazioni di sudo. È anche più ingombrante per una singola variabile. Questo è utile solo per qualcosa che dovrebbe sempre essere esportato.
terdon

Sì, è un compromesso, ma non tutte le variabili di ambiente sono ugualmente dannose. C'è una differenza sostanziale tra il riporto LD_PRELOADe il riporto LESSCHARDEF. Non credo che la convenienza dovrebbe essere l'argomento vincente qui ...
lcd047

1
@ lcd047 vale sicuramente la pena inviare il tuo suggerimento come risposta. Il mio punto è che non è pratico per esportare variabili arbitrarie. Sì, se esiste una variabile specifica che si desidera esportare sempre, questa è la strada da percorrere, ma non se si desidera farlo una volta per una variabile definita nella stessa sessione.
terdon

7

-E fa il lavoro per me. Dall'uomo sudo-

-E, Indica la politica di sicurezza che l'utente desidera conservare le proprie variabili di ambiente esistenti. La politica di sicurezza può restituire un errore se l'utente non ha il permesso di preservare l'ambiente.--preserve-env


Sfortunatamente farà il lavoro solo se il tuo amministratore non ti ha impedito di usare -E.
TorstenS

0

Quella che segue è una soluzione che non ne ha bisogno per cambiare la politica di sicurezza.

Ignorerò la suparte, poiché possiamo usare l' --useropzione di sudo.

Vogliamo passare le variabili di ambiente a una commandcorsa tramite sudo. Tuttavia sudo, non consentirà il passaggio di variabili d'ambiente a un comando (ci sono validi motivi di sicurezza per questo, alcune variabili possono essere pericolose). Una shell può essere utilizzata per impostare variabili di ambiente e sudopuò eseguire una shell con uno script passato ad essa. Pertanto dire sudodi eseguire uno script che imposta le variabili di ambiente.

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
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.