Saya sedang menulis program utilitas kecil. Saya ingin mencoba- sudo
menjalankan sesuatu jika diperlukan.
Itu adalah: jika izin file tidak memungkinkan pengguna saat ini beroperasi pada file tertentu (dan sudo
aturan akan mengizinkannya) Saya ingin utilitas saya sudo
menjalankan -l sesuatu sebagai pemilik file.
Saya berharap untuk memeriksa kemampuan ini sebelumnya, karena saya lebih suka log sistem tidak mengisi dengan kebisingan dari sudo
upaya yang gagal . Seperti sudo
itu sendiri melaporkan kegagalan: "Insiden ini akan dilaporkan".
Jadi, saya berharap untuk memeriksa secara program: dapat user <x>
dijalankan command <y>
melalui sudo
?
Inilah masalahnya: sementara /etc/sudoers
berisi pemetaan itu, itu dimiliki oleh root dan tidak dapat dibaca oleh pengguna biasa.
Saya sedang mempertimbangkan memunculkan subproses untuk dijalankan sudo -l
(yang menampilkan perintah yang dapat dijalankan oleh pengguna saat ini). Saya kemudian akan menguraikan output ini. Namun, ini agak rapuh. Outputnya berisi informasi yang saya inginkan, tetapi sepertinya dirancang untuk dibaca manusia (bukan untuk konsumsi terprogram). Saya tidak tahu apakah ada jaminan bahwa output akan mengikuti format yang sama di masa depan, atau di berbagai platform.
Apakah parsing sudo -l
output terprogram dianggap aman? Jika tidak, apakah ada opsi yang lebih baik, untuk menentukan sebelumnya apakah perintah sudo akan berhasil?
(latar belakang pada X / Y: Utilitas ini untuk digunakan oleh akun peran akses terbatas. Saya berharap beberapa pengguna lain secara efektif memilih untuk memungkinkan akun akses terbatas untuk beroperasi pada file mereka melalui aturan sudo. Namun, saya menang tahu sebelumnya siapa pengguna lain yang memiliki aturan sudo yang relevan)
Jawaban:
Menurut halaman manual sudo:
jadi ini akan mendidih
Seperti yang ditunjukkan oleh Muru, digunakan baik
-U $USER
atau-U $USERTOTEST
atau tidak, tergantung pada kebutuhan Anda.sumber
$USER
berarti pengguna saat ini, Anda bisa melakukannyasudo -l <command>
, tanpa-U $USER
.(targetUser) ALL, !/usr/bin/foo
.. dalam kasus itusudo -l -u targetUser /usr/bin/foo
masih muncul untuk output/usr/bin/foo
dan keluar dengan status 0. Namun, itu pada dasarnya cukup untuk pemeriksaan sederhana saya, dan mengalahkan parsingsudo -l
output yang lebih verbose .