Aşağıdaki seçenek, yalnızca seçeneklerin bir bölümünün değişken olduğu belirli bir seçenek kümesi varsa, parola olmadan bir komut çalıştırmak istediğiniz durum içindir . AFAIK, sudoers bildirimlerinde değişkenleri veya değer aralıklarını kullanmak mümkün değildir, yani aşağıdakilere açıkça erişime izin verebilir command option1
ancak şunları kullanamazsınız command option2
:
user_name ALL=(root) /usr/bin/command option1
yapıdır ama eğer command option1 value1
nerede, value1
değişebilir, sen her olası değeri için açık Sudoers hatları olması gerekir value1
. Shell betiği etrafına bir yol sağlar.
Bu cevap, M. Ahmad Zafar'ın cevabından ilham aldı ve buradaki güvenlik sorununu düzeltti.
- Komutu çağırmadan bir kabuk betiği oluşturun
sudo
.
- Komut dosyasını kök ayrıcalıklı bir klasöre (örn.
/usr/local/bin/
) Kaydedin, dosyayı chown root:wheel /usr/local/bin/script_name
başkalarına (örneğin chmod 755 /usr/local/bin/script_name
) yazma erişimi olmayan bir kök (sahip ) yapın.
Visudo kullanarak sudo'lara istisna ekleyin:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Senaryonuzu çalıştırın sudo script_name
.
Örneğin, macOS'ta ekran uyku zaman aşımını değiştirmek istiyorum. Bu kullanılarak yapılır:
sudo pmset displaysleep time_in_minutes
Uyku zaman aşımını değiştirmeyi, parola yazmanın zorluğunu haklı çıkarmayan masum bir eylem olarak değiştirmeyi düşünüyorum, ancak pmset
birçok şey yapabilir ve bu diğer şeyleri sudo parolanın arkasında tutmak isterim.
Bu yüzden aşağıdaki komut dosyası var /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
sudoers
Dosyanın sonunda şu satır var:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Zaman aşımını 3 dakika olarak ayarlamak için komut dosyasını normal kullanıcı hesabından çalıştırıyorum user_name
:
sudo ds 3
Not: Komut dosyamın çoğu, zorunlu olmayan giriş doğrulamadır, bu nedenle aşağıdakiler de işe yarar:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
python betiği olsaydı bu hala işe yarar mıydı?