Bagaimana cara mengekspor variabel untuk digunakan dengan sudo?

24

Di Slackware, menggunakan sbopkgizin untuk membuat paket dari sumber. Repos tidak sebesar Debian, tapi bagus.

Beberapa perangkat lunak dapat menggunakan variabel lingkungan, misalnya pada emulator VICE c64, jika variabel FFMPEGdiatur ke yes, itu akan memungkinkan ffmpegperekaman emulator.

Saya mencoba menggunakan

$ export FFMPEG=yes; sudo sbopkg -B -i vice

tetapi ffmpegdinonaktifkan.

Sebaliknya saya harus menggunakan

$ su -
$ export FFMPEG=yes
$ sbopkg -B -i vice

yang bekerja

Bagaimana cara menggunakan variabel lingkungan sudo?

elbarna
sumber

Jawaban:

39

Anda dapat menggunakan -Eopsi sudo :

FMPEG=yes sudo -E sbopkg -B -i vice

Dari manual:

-E, --preserve-env

Menunjukkan kebijakan keamanan bahwa pengguna ingin mempertahankan variabel lingkungan yang ada. Kebijakan keamanan dapat mengembalikan kesalahan jika pengguna tidak memiliki izin untuk melestarikan lingkungan.

Perhatikan bahwa ini mengekspor semua variabel lingkungan Anda yang ada. Lebih aman untuk hanya mengekspor variabel lingkungan yang Anda butuhkan dengan sintaks berikut :

sudo FMPEG=yes sbopkg -B -i vice

Xhienne
sumber
Terima kasih tetapi tidak bekerja (opsi.-E) baris yang lain ok jadi karena jawaban pertama saya pilih sebagai benar.
elbarna
11

sudomembersihkan variabel-variabel di lingkungan sebelum menjalankan perintah yang diberikan. Anda harus memintanya untuk mempertahankan variabel di lingkungan agar perintah Anda berfungsi.

Selain itu, Anda harus exportdengan FMPEGvariabel sebelum menggunakan sudo( export FMPEG=yes; sudo), menetapkan di mana saja sama seperti memohon sudo( FMPEG=yes sudo), atau menggunakan env( env FMPEG=yes sudo).

Untuk mempertahankan variabel lingkungan, gunakan -E(atau --preserve-env):

$ env FMPEG=yes sudo -E sbopkg -B -i vice

Dimungkinkan juga untuk menetapkan variabel lingkungan spesifik seperti ini:

$ sudo FMPEG=yes sbopkg -B -i vice

Jika gagal karena kebijakan keamanan yang berlaku, buka shell root dan setel variabel di sana:

$ sudo -s
# env FMPEG=yes sbopkg -B -i vice
# exit
Kusalananda
sumber
6

perhatikan bahwa: (export a=b; command)sama dengan a=b command. Perhatikan tanda kurung.

Maka jika kita menerapkan variabel tidak sudo tetapi langsung ke sbopkg, maka alih-alih FFMPEG=yes sudo sbopkg -B -i vice kita bisa melakukannya sudo FFMPEG=yes sbopkg -B -i vice

Jika polisi keamanan mencegah hal ini, maka: sudo bash -c "FFMPEG=yes sbopkg -B -i vice"

(Jangan gunakan -E, itu tidak aman karena akan membocorkan semua jenis variabel yang tidak terduga.)

ctrl-alt-delor
sumber