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' -popzione di sucomando preserva le variabili di ambiente.
-pè un'opzione su, non sudoin questo caso
-mpreserva la variabile, altri dicono -cqual è 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 -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
env_keepin 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_PRELOADe 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 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
"
sudo -iu ec2-user echo $DUMMY?