cara meneruskan variabel lingkungan ke sudo su

30

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.

Umang
sumber
Bagaimana dengan sederhana sudo -iu ec2-user echo $DUMMY?
muru
1
Kemungkinan duplikat dari Bagaimana membuat `sudo` mempertahankan $ PATH?
kenorb

Jawaban:

39

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 -ppilihan untuk superintah melestarikan variabel lingkungan.

cuonglm
sumber
3
Saya pikir "-E" mempertahankan variabel lingkungan sudo.ws/man/sudo.man.html
Andy
1
@Andy Tapi sering dilarang oleh konfigurasi sudo.
Gilles 'SANGAT berhenti jahat'
@cuonglm - terima kasih. Ini bekerja. Seharusnya tidak memanggil shell login.
Umang
1
@kenorb: Tidak, -padalah pilihan su, tidak sudodalam kasus ini
cuonglm
Ada utas lain yang mengatakan -mmempertahankan variabel, yang lain mengatakan -capa bedanya? Dan salah satu komentar di hari jawaban ini -E stackoverflow.com/questions/10488758/…
Vishrant
49

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 -iatau sudo -l. Jika Anda telah mengaktifkan akun root, Anda juga dapat menjalankannya susendiri, tetapi sudo sutidak berguna. Dan ya, saya tahu Anda melihatnya di mana-mana.

Yang mengatakan, sudomemiliki -Esaklar 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 -ctidak 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
terdon
sumber
2
Cara yang lebih baik untuk melestarikan variabel lingkungan adalah dengan menambahkannya ke env_keepdalam sudoers. Mungkin seperti ini: Defaults env_keep += "DUMMY".
lcd047
@ lcd047 tapi itu akan melestarikan lingkungan untuk semua doa sudo. Itu juga lebih rumit untuk satu variabel. Itu hanya berguna untuk sesuatu yang harus selalu diekspor.
terdon
Ya, ini merupakan trade-off, tetapi tidak semua variabel lingkungan sama-sama berbahaya. Ada perbedaan mendasar antara terbawa LD_PRELOADdan terbawa LESSCHARDEF. Saya tidak berpikir kenyamanan seharusnya menjadi argumen yang menang di sini ...
lcd047
1
@ lcd047 saran Anda tentu layak dikirim sebagai jawaban. Maksud saya adalah tidak praktis untuk mengekspor variabel arbitrer. Ya, jika ada variabel tertentu yang selalu ingin Anda ekspor, itu adalah cara untuk pergi tetapi tidak jika Anda ingin melakukan ini sekali dan untuk variabel yang ditentukan dalam sesi yang sama.
terdon
7

-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

Amit Jha
sumber
Sayangnya itu hanya akan melakukan pekerjaan jika admin Anda tidak membatasi Anda untuk menggunakan -E.
TorstenS
0

Berikut ini adalah solusi yang tidak perlu dilakukan seseorang untuk mengubah kebijakan keamanan.

Saya akan mengabaikan subagian itu, karena kita dapat menggunakan --useropsi sudo.

Kami ingin meneruskan variabel lingkungan ke commandrun via sudo. Namun sudotidak 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 sudodapat menjalankan shell dengan skrip yang diteruskan ke sana. Oleh karena itu katakan sudountuk 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
"
ctrl-alt-delor
sumber