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 option1tetapi tidak command option2menggunakan:
user_name ALL=(root) /usr/bin/command option1
tetapi jika strukturnya command option1 value1, di mana value1bisa 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 pmsetdapat 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 sudoersfile 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/programitu adalah skrip python?