Belirli bir komut için sudo şifresini her zaman nasıl zorlayabilirim?


12

Geçen gün web sunucumda bazı bakım işleri yapıyordum. Acelem ve uykum vardı, bu yüzden her şeyi sudokomut kullanarak yaptım .

Ve sonra, yanlışlıkla bu komutu web sunucuma göndererek Ctrl+ tuşuna Vbastım:

sudo rm -rf /*

Yukarıdaki komutun ne yaptığını merak edenler için: Bu, tüm web sunucumu sildi

Neyse ki, yedeklemeler vardı ve ne yazık ki, bu harika hatayı düzeltmek için uyanık olmak için iki saat daha harcamak zorunda kaldım. Ama o zamandan beri merak ediyorum:

Belirli bir komut için sudo şifresini her zaman zorlamanın bir yolu var mı?

Sunucu benden bir şifre isteseydi, kendimi çok fazla sorundan kurtarırdım. Görmedi, çünkü sudobu görkemli hatadan önce yaklaşık 5 komut çalıştırdım .

Peki, bunu yapmanın bir yolu var mı? Her rmzaman uygulanabilmesi için sadece komut ile şifreye ihtiyacım var . Kullandığım diğer komutlar genellikle nanoveya cpher ikisi de (bir dereceye kadar) geri döndürülebilir.



2
@solsTiCe /*rm komutuna geçirilmeden önce genişletilir. Yani komut tek bir argüman görmüyor, ama bir argüman listesi ( /bin /boot /cdrom /dev /etc /home...)
Dan

3
Bundan kurtulmak için önemli bir ders, gerçekten ihtiyaç duymadıkça sudo ile bir şeyler çalıştırmamanızdır. Bunun burada sorduğunuz sorulara cevap vermediğini biliyorum, ancak kapsayıcı soru sunucunuzu tekrar silmenizi (umarım) nasıl önleyeceğiniz ve sudo'dan kaçınmanın buna karşı ilk savunma hattınız olması gerektiğidir.
David Z


2
@ WinEunuuchs2Unix Bu yinelenen bir soru değil, buradaki op rmkomutun bir parolaya sahip olmasını istemiyor . Onlar sadece sudorm komutu her kullanıldığında bir istem ister . Bağladığınız sorunun çözümü ilk komutunuz olduğunda biraz sinir bozucu olacaktır sudo rm. Sizden iki şifre isteyecektir, biri için sudobir tane rm.
Dan

Yanıtlar:


17

İçindeki belirli komutlar için timestamp_timeoutto değerini ayarlayabilirsiniz . Aşağıdaki içeriğe sahip bir dosya oluşturun :0/etc/sudoersvisudo -f /etc/sudoers.d/pduck

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Artık kullanıcı pduck, grubun sudo rmüyesi olmasına ve diğer komutlar için şifresini hatırlamasına rağmen, kullanıcıdan her zaman çalışırken (hangi ek parametrelerin verildiğine bakılmaksızın) bir şifre istenir .sudosudo

Dezavantajı, bunu /bin/rmdaha da kısıtlamak için dosyadaki satıra kolayca parametre ekleyememenizdir . Şey… şunları yapabilirsiniz:

Cmnd_Alias DANGEROUS = /bin/rm -f

ancak tam olarak istenir , örneğin sudo rm -f(tekrar) istenmez sudo rm -rf.


9

Bir yöntem safe-rm kullanmak olacaktır . Bu YALNIZCA "rm" kullanımını ve "rm" nin belirli sürümlerinin çalışmasını engelleyecektir. Bu, kök sisteminizin kaldırılmasını içerir ancak "/ usr /" veya "/ var /" gibi sistemle ilgili dizinlerin kaldırılmasını önlemek için de kullanılabilir. Bağlantıdan:

Önemli dosyaların yanlışlıkla silinmesini geri alma

Safe-rm, /bin/rmverilen argümanları hiçbir zaman kaldırılmaması gereken yapılandırılabilir bir dosya ve dizin listesine karşı kontrol eden bir sarmalayıcı ile değiştirerek önemli dosyaların yanlışlıkla silinmesini önlemeye yönelik bir güvenlik aracıdır .

Bu korumalı dosya veya dizinlerden birini silmeye çalışan kullanıcılar bunu yapamayacak ve bunun yerine bir uyarı mesajı gösterilecektir:

$ rm -rf /usr   
Skipping /usr

(Korunan yollar hem site hem de kullanıcı düzeylerinde ayarlanabilir.)

Yanlışlıkla sildiğiniz önemli dosyaları kurtarmak oldukça zor olabilir. Safe-rm yükleyerek kendinizi bugün koruyun ve bir veri kurtarma servisine başvurmanız gerekebileceğini azaltın!

resim açıklamasını buraya girin


Safecow için seçildi
Michael Fulton

3

sudobir seçenek sunar -k, --reset-timestamp, bkz man sudo:

Bir komut veya parola gerektirebilecek bir seçenekle birlikte kullanıldığında, bu seçenek sudo'nun kullanıcının önbelleğe alınmış kimlik bilgilerini yok saymasına neden olur. Sonuç olarak, sudo bir parola ister (güvenlik ilkesi tarafından isteniyorsa) ve kullanıcının önbelleğe alınmış kimlik bilgilerini güncellemez.

sudoTest etmek rm -rf /*ve çalıştırmak için basit bir sargı yazabilirsiniz

sudo -k rm -rf /*

bunun yerine, örneğin şöyle:

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Örnek kullanım

echo aBurada test ediyoruz .

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

Genel olarak her çalıştırdığınızda sorulmasını rmistiyorsanız, yukarıdaki işlevi aşağıdaki gibi uyarlayabilirsiniz:

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Hem genel komut çağrılarını hem de belirli komut satırlarını birleştirmek istiyorsanız case, örneğin:

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

Not bu yaklaşımlar kaçmadın işe eğer o sudoseçeneklerle - olası çözümler aşağıda [[ "$*" =~ " rm " ]]boşluklarla ya çevrili dize “rm” kontrol etmek *" rm "*)ile case“rm” içeren herhangi bir komut satırı yakalamak için.


[[ "$1" == "rm" ]] && opt="-k";ve nasıl /bin/rm?
Rinzwind

@Rinzwind Bence fonksiyon özellikle ihtiyaçlara özel ihtiyaçlara kolayca uyarlanabilir case.
tatlı

1

Bu cevap, sudosorunuzun bir bölümünü ele almaz ancak diğer yandan rm, herhangi bir kullanıcı için kazara çağrılma tehlikesini azaltmanın bir yolunu ele alır .

Şunları yapabilirsiniz takma rmiçin rm -Ihangi

  • bir dizini veya 3'ten fazla dosyayı siler silinmez onay ister
  • dışarıda bıraktığınız sürece,-f önceki -Iseçenekleri geçersiz kılar .

--one-file-systemrmtakma adımda kullandığım istenmeyen silinmeye karşı bir başka olası koruma .

Kurmak

Böyle bir takma ad oluşturmak için şu komutu kullanın:

alias rm='rm -I --one-file-system'

Bunu kendinize ~/.bashrcveya hatta içine koyabilirsiniz /etc/bash.bashrc.

kullanım

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

yesYerel ayarınıza veya her iki sözcüğün ilk harfine türü veya çevirisini onaylamak için tuşuna basın Enter. Hiçbiri dahil olmak üzere diğer girdiler işlemi iptal eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.