Fondamentalmente ho bisogno di fare questo:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Questo non funziona Come posso passare la variabile env $ DUMMY su su? -p non funziona con -l.
Fondamentalmente ho bisogno di fare questo:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Questo non funziona Come posso passare la variabile env $ DUMMY su su? -p non funziona con -l.
Risposte:
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' -p
opzione di su
comando preserva le variabili di ambiente.
-p
è un'opzione su
, non sudo
in questo caso
-m
preserva la variabile, altri dicono -c
qual è la differenza? E uno dei commenti in questi giorni di risposta -E
stackoverflow.com/questions/10488758/…
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 -i
o sudo -l
. Se hai attivato l'account di root, puoi anche eseguire su
da solo, ma sudo su
non è utile. E sì, so che lo vedi dappertutto.
Detto questo, sudo
ha l' -E
interruttore 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
env_keep
in sudoers
. Forse come questo: Defaults env_keep += "DUMMY"
.
sudo
. È anche più ingombrante per una singola variabile. Questo è utile solo per qualcosa che dovrebbe sempre essere esportato.
LD_PRELOAD
e il riporto LESSCHARDEF
. Non credo che la convenienza dovrebbe essere l'argomento vincente qui ...
-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
Quella che segue è una soluzione che non ne ha bisogno per cambiare la politica di sicurezza.
Ignorerò la su
parte, poiché possiamo usare l' --user
opzione di sudo
.
Vogliamo passare le variabili di ambiente a una command
corsa 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 sudo
può eseguire una shell con uno script passato ad essa. Pertanto dire sudo
di 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
"
sudo -iu ec2-user echo $DUMMY
?