`/ etc / sudoers` - tentukan` env_keep` hanya untuk satu perintah?

23

Apakah ada cara untuk menentukan yang sudoseharusnya mempertahankan variabel lingkungan tertentu hanya untuk perintah yang ditentukan? Untuk beberapa tujuan, saya ingin $HOMEenv saya . variabel dipertahankan ketika saya menjalankan perintah tertentu. Untuk keperluan lain dan perintah lain, saya ingin mengatur ulang. Bisakah ini dilakukan /etc/sudoers?

Edit:

Terima kasih atas jawabannya. Saya ingin tahu apakah saya dapat mengajukan pertanyaan lanjutan, yaitu, "Mengapa, kalau begitu, ini tidak berhasil?"

Dalam contoh saya mencoba bekerja, saya ingin sudo nanomembaca $HOME/.nanorc. Jika saya menggunakan ini:

Defaults:simon env_keep=HOME

ini bekerja dengan sempurna. Jika saya menggunakan ini:

Defaults!/bin/nano env_keep=HOME

atau ini:

Cmnd_Alias      NANO = /usr/bin/nano,/bin/nano,/bin/rnano
Defaults!NANO   env_keep=HOME

itu tidak berfungsi sama sekali. Ada saran mengapa? (Saya sedang menguji Debian, btw.)

(Catatan: Saya tidak berpikir itu nanospesifik, btw - Saya dapat mereproduksi perilaku dengan skrip bash satu baris yang hanya echos $HOME).

simon
sumber
1
Alih-alih mencoba menjalankan nano melalui sudo untuk menggunakan file konfigurasi yang sama, gunakan sudoeditsebaliknya. sudoeditakan menjalankan menyalin isi file ke file tmp dan menjalankan editor pilihan Anda sebagai pengguna Anda, ketika editor keluar akan memeriksa apakah Anda mengubah sesuatu dan jika demikian ganti yang asli dengan yang diedit. Anda dapat memilih editor mana yang Anda inginkan untuk dijalankan dengan mengatur $EDITORatau $ VISUAL `env vars.
Arrowmaster
@Arrowmaster - terima kasih, itu sepertinya pendekatan yang lebih baik daripada yang saya mainkan. Karena saya sudah membungkus sudodengan fungsi saya sendiri, saya hanya menambahkan if [ "$1" == "$EDITOR" ]; thenblok dan sekarang saya panggil sudoedit:)
simon

Jawaban:

21

Untuk mengesampingkan env_keephanya untuk /path/to/command(ketika dijalankan melalui aturan apa pun, oleh pengguna mana pun) dan untuk pengguna joe(tidak peduli apa perintah yang ia jalankan):

Defaults!/path/to/command env_keep=HOME
Defaults:joe env_keep=HOME

Anda dapat menggunakan -=atau +=untuk menghapus atau menambahkan entri ke env_keepdaftar.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
brilian, terima kasih. Saya tidak dapat menemukan contoh yang tepat dari sintaks itu. Sekarang setelah Anda menjabarkannya untuk saya, saya bisa melihat bagaimana saya seharusnya mengatasinya dari manhalaman, dan saya merasa sedikit bodoh. Tidak diragukan lagi, jawaban ini akan membantu orang lain juga.
simon
1
@simon: Jangan merasa bodoh, saya juga menemukan deskripsi sintaksis di sudoershalaman manual sulit untuk dikerjakan dari deskripsi formal dan contoh-contoh yang lebih mudah ditemukan jika Anda sudah tahu cara menulisnya.
Gilles 'SANGAT berhenti menjadi jahat'
hmm - mungkin saya berbicara dengan segera. Sekarang saya coba ini, saya tidak bisa membuatnya bekerja. Bisakah saya menyulitkan Anda untuk melihat revisi saya?
simon
1
@simon: Tebakan saya adalah Anda juga memiliki entri yang memungkinkan Anda melakukan segalanya dan tidak memiliki env_keeppengaturan itu ( simon ALL = ALL). Sudo menggunakan entri yang cocok terakhir .
Gilles 'SANGAT berhenti menjadi jahat'
Hati-hati, jika secure_path disetel, Anda juga harus menambahkan Default: joe! Secure_path
Jistanidiot
6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

Baris-baris itu dari saya sendiri /etc/sudoersuntuk memperbaiki masalah yang pbuilderterlihat pada $HOMEfile konfigurasi penggunanya tetapi harus dijalankan sebagai root (memindahkannya untuk /rootagak mengalahkan tujuan memiliki sistem dan file konfigurasi pengguna).

Arrowmaster
sumber
ya, itu kasus penggunaan yang sangat mirip dengan yang ada dalam pikiran saya, terima kasih!
simon
apakah Anda tahu mengapa contoh-contoh dalam revisi saya sepertinya tidak berfungsi?
simon
@simon sudo sangat pilih-pilih tentang urutan entri dalam konfigurasi, kemudian entri akan menimpa yang sebelumnya. Mungkin ada beberapa konflik seperti itu di konfigurasi Anda.
Arrowmaster
1

man sudoers:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller’s environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

Karenanya ya, Anda bisa melakukannya menggunakan env_reset, env_keepdan env_checkdi / etc / sudoers Anda.

Paweł Brodacki
sumber