Saya pada dasarnya perlu melakukan ini:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Ini tidak berfungsi. Bagaimana saya bisa meneruskan variabel env $ DUMMY ke su? -p tidak bekerja dengan -l.
Saya pada dasarnya perlu melakukan ini:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Ini tidak berfungsi. Bagaimana saya bisa meneruskan variabel env $ DUMMY ke su? -p tidak bekerja dengan -l.
Jawaban:
Anda dapat melakukannya tanpa memanggil shell login:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
atau:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
The -p
pilihan untuk su
perintah melestarikan variabel lingkungan.
-p
adalah pilihan su
, tidak sudo
dalam kasus ini
-m
mempertahankan variabel, yang lain mengatakan -c
apa bedanya? Dan salah satu komentar di hari jawaban ini -E
stackoverflow.com/questions/10488758/…
Kiat pro: Tidak pernah ada alasan bagus untuk menjalankansudo su
. Untuk menjalankan perintah sebagai pengguna yang berbeda, gunakan sudo -u username command
. Jika Anda menginginkan shell root, jalankan sudo -i
atau sudo -l
. Jika Anda telah mengaktifkan akun root, Anda juga dapat menjalankannya su
sendiri, tetapi sudo su
tidak berguna. Dan ya, saya tahu Anda melihatnya di mana-mana.
Yang mengatakan, sudo
memiliki -E
saklar yang akan melestarikan lingkungan sesi pengguna:
-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.
Jadi, pertama-tama Anda perlu mengekspor variabel Anda, dan kemudian jalankan sudo -E
:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
Itu bash -c
tidak dibutuhkan. Namun, jika saya menjalankan sudo -Eu bob echo "$DUMMY"
, variabel diperluas sebelum shell root diluncurkan sehingga tidak menunjukkan bahwa perintah benar-benar berfungsi:
$ 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
dalam sudoers
. Mungkin seperti ini: Defaults env_keep += "DUMMY"
.
sudo
. Itu juga lebih rumit untuk satu variabel. Itu hanya berguna untuk sesuatu yang harus selalu diekspor.
LD_PRELOAD
dan terbawa LESSCHARDEF
. Saya tidak berpikir kenyamanan seharusnya menjadi argumen yang menang di sini ...
-E melakukan pekerjaan untukku. Dari man sudo
-
-E
, Menunjukkan kebijakan keamanan yang diinginkan pengguna untuk melindungi variabel lingkungan yang ada. Kebijakan keamanan dapat mengembalikan kesalahan jika pengguna tidak memiliki izin untuk melestarikan lingkungan.--preserve-env
Berikut ini adalah solusi yang tidak perlu dilakukan seseorang untuk mengubah kebijakan keamanan.
Saya akan mengabaikan su
bagian itu, karena kita dapat menggunakan --user
opsi sudo
.
Kami ingin meneruskan variabel lingkungan ke command
run via sudo
. Namun sudo
tidak akan mengizinkan variabel lingkungan untuk diteruskan ke perintah (ada alasan keamanan yang valid untuk ini, beberapa variabel bisa berbahaya). Shell dapat digunakan untuk mengatur variabel lingkungan, dan sudo
dapat menjalankan shell dengan skrip yang diteruskan ke sana. Oleh karena itu katakan sudo
untuk menjalankan skrip yang mengatur variabel lingkungan.
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
?