Berikut ini adalah untuk kasus di mana Anda ingin menjalankan perintah tanpa kata sandi hanya jika memiliki serangkaian opsi tertentu, di mana bagian dari opsi adalah variabel . AFAIK tidak mungkin menggunakan variabel atau rentang nilai dalam deklarasi sudoers, yaitu Anda dapat mengizinkan akses secara eksplisit ke command option1
tetapi tidak command option2
menggunakan:
user_name ALL=(root) /usr/bin/command option1
tetapi jika strukturnya command option1 value1
, di mana value1
bisa bervariasi, Anda harus memiliki garis sudoer eksplisit untuk setiap nilai yang mungkin value1
. Script shell menyediakan jalan keluar.
Jawaban ini terinspirasi oleh jawaban M. Ahmad Zafar dan memperbaiki masalah keamanan di sana.
- Buat skrip shell tempat Anda memanggil perintah tanpa
sudo
.
- Simpan skrip dalam folder istimewa root (mis.
/usr/local/bin/
), Buat file milik root (mis. chown root:wheel /usr/local/bin/script_name
) Tanpa akses tulis untuk orang lain (mis chmod 755 /usr/local/bin/script_name
.).
Tambahkan pengecualian ke sudoers menggunakan visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Jalankan skrip Anda sudo script_name
.
Sebagai contoh, saya ingin mengubah waktu tidur tampilan pada macOS. Ini dilakukan dengan menggunakan:
sudo pmset displaysleep time_in_minutes
Saya menganggap mengubah batas waktu tidur sebagai tindakan tidak bersalah yang tidak membenarkan kerumitan pengetikan kata sandi, tetapi pmset
dapat melakukan banyak hal dan saya ingin menyimpan hal-hal lain ini di belakang kata sandi sudo.
Jadi saya punya skrip berikut di /usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
Di akhir sudoers
file saya memiliki baris berikut:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Untuk menetapkan batas waktu 3 menit, saya menjalankan skrip saya dari akun pengguna biasa user_name
:
sudo ds 3
PS Sebagian besar skrip saya adalah validasi input, yang tidak wajib, jadi yang berikut ini juga berfungsi:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
itu adalah skrip python?