Basudo'da “true” nun amacı nedir? Sudo true ise; sonra"


20

Kullanıcı süper kullanıcı ayrıcalıklarına sahip olup olmadığını sınamayan bu bash betiğini birlikte hackledim ve istemiyorlar. Sonuçta ben aşağıdaki iki satır (echo "password ok" ve sonraki satırda başka) kaldırmak böylece ikinci 'if' deyimi ters çevirmeye çalışıyorum

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

Dördüncü satırdaki "doğru" amacı sadece bir boş ifade midir?

Testi dördüncü satırda tersine çevirmem gerekiyor, nasıl yaparım? İşte denedim:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
Soruyu küçümseyecekseniz, lütfen soruyu geliştirmek için neler yapabileceğimi açıklar mısınız? Bu doğru taşma sitesi değil mi?
Matt Parkins

4
Aşağı oyların nereden geldiğinden emin değilim; ifadeyi reddetmeye mi yoksa ifadeyi geçersiz kılmaya mı çalışıyorsunuz ? Hem gerçek / yankıdan hem de "başka" dan kurtulmak istediğinizi söylüyorsunuz, son hedefiniz nedir?
Jeff Schaller


1
@ ctrl-alt-delor Bu bağlantıyı izleyerek ihtiyacım olan tek şey sudo'nun önüne bir ünlem işareti koymak ve hem yankıyı hem de başkalarını kaldırabilirim ve şimdi test ettim, işe yarıyor, teşekkürler.
Matt Parkins

2
Geçerken, muhtemelen hata mesajını hata akışına yönlendirmelisiniz:echo "Aborting script" >&2
Toby Speight

Yanıtlar:


38

truebash'de bir anahtar kelime değil, başarılı bir çıkış koduyla anında çıkan bir programdır. Aynı şekilde, falsebaşarısız bir çıkış koduyla çıkan bir programdır.

Her iki programı da terminalinizden çalıştırarak ve ardından $?son programın çıkış kodunu içeren değişkeni okuyarak bunu deneyebilirsiniz ;

true
echo $? # 0
false
echo $? #1

if sudo trueeşdeğer değil if sudo == true. if sudo trueçalışıyor trueprogramını kullanarak sudove çıkış kodu kontrol ediyor.

Bu nedenle:

if sudo false; thenprogramı falsesudo olarak çalıştırıyor . Dönüş her zaman yanlış olacaktır.

if sudo true == falseprogramı trueargümanlarla ==ve falsekullanarak çalıştıracaktır sudo. Açıkçası bu sizin istediklerinizi istemiyor.

if [!(sudo true)] geçersiz sözdizimidir.

Muhtemelen aradığınız şey

if ! sudo true;

12
Hafif bilgiçlik ilk cümle düzeltme gibi: bash , trueve false"builtins" komutları kabuk tarafından direkt olarak yorumlanır vardır; genel olarak Unix benzeri sistemlerde , dosya sisteminde bağımsız programlar olarak da bulunurlar. Fark burada çok önemli değil, ama bildiğim kadarıyla sudo true, bash yerleşikliğini değil, bağımsız programı çalıştırıyor olacak.
IMSoP

31
PS: benim en sevdiğim özetleri trueve falseadam sayfalarında başlıklardır: true - do nothing, successfullyvefalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP Bu çok derin.
brainplot

2
Eğer trueolmasaydı, soru gösterir kod neden bir icat gerekebilir! Yalnızca üzerinde çalıştığı sistem gerçekten bozuksa başarısız olabilecek minimal bir programdır. Böylece erişim kimlik bilgilerinin uygun olup olmadığını belirlemek için kullanabilirsiniz.
nigel222

2
AT&T SYSV Unix'te "true", yorumlarda büyük bir telif hakkı uyarısından oluşan bir kabuk betiği / bin / true idi ... ve başka bir şey yoktu.
Lee Daniel Crocker

21

Kabul edilen cevabın sorunuzu gerçekten cevaplamadığını hissediyorum?

Bunu yapmanın amacı gerçekten yapabileceğinizi kontrol etmektir sudo.

Bu kontrolün nasıltrue yapılacağı, kabul edilen cevapta açıklanan program aracılığıyla yapılır .


1
Esasen, bu. Alternatif, kullanıcının sudoers grubunda olup olmadığını kontrol etmek olabilir, ancak sadece çalışan sudo truebir yol olsa da, biraz hacky yeterince kolay.
Sergiy Kolodyazhnyy

3
Bunun da sudoyüklenmesi gerektiğini unutmayın, bu nedenle kontroller tamamen eşdeğer olmaz ... sudoers grubunda olabilirsiniz ve yine de sudo yapamazsınız. (Bu özellikle, örneğin küçük bir rootfs tarball'dan sudo içermeyen yeni bir görüntü oluşturmak için bir komut dosyası yazıyorsanız ortaya çıkabilir.)
Mehrdad

1
OP, sudo yapamıyorsanız ve bir noop'u takip eden başka bir şey yerine iki satırdan kurtulmak istiyorsa bırakmak istiyor.
mckenzm

2
Tersine, siz sudo(kişisel olarak veya başka bir grubun üyesi olarak ) listelendiğinizde sudoers grubunda olmadan da yapabilirsiniz /etc/sudoers. Ancak sudo true, sudosadece belirli komutlar için erişim verilebildiğinden , yanılmaz bile değildir , bu nedenle bunu yapabilirsiniz sudo true, ancak sudo something_elsetam tersi yapabilirsiniz. Gerçekte çalıştırmak istediğiniz komutu çalıştırmaya çalışmaktan başka, test etmek için demir kaplı bir yol yoktur sudo.
Dave Sherohman

2
Ayrıca, olabilir sudoersgrubu ve mümkün olmayacaktır sudoçünkü sudoersgrup yer almıyorsa sudoersdosyası. Adında dört harf sudobulunan bir grup, o gruptaki bir kullanıcının belirli bir şeyi veya herhangi bir şeyi kullanarak yapıp yapamayacağının geçerli bir göstergesi değildir sudo.
jrw32982 Monica

5

Bu senaryoda gördüğüm gibi. Sadece sudo'nun etkin olup olmadığını kontrol ediyor, o kadar ..

true sadece true değerini döndürür.

Yani bu durumda sudo ile herhangi bir komut çalıştırmaları gerekiyorsa, ilk başta denetler ve parolayı yalnızca bir kez sorar.

Koşul şu şekilde çalışır: sudo doğru komutu doğru şekilde yürütüyorsa, if koşulu için true değerini döndürür, sonra sudo etkinleştirilir ve kullanıcı parolayı doğru yazdı, aksi takdirde parolayı yanlış girdiniz veya sudo etkinleştirilmedi, komut dosyası devam etmemeli.

Diğer komutların sudo şifresi sormasına gerek yoktur, çünkü kimlik doğrulamanız ilk kez başarılı bir şekilde yapılır (ancak bu sudo yapılandırmasına bağlıdır, bu nedenle bu komut dosyaları ortam yapılandırmasına çok bağlıdır)

'Echo password ok' da bunu gösteriyor. kabuk betiği artık parolayı sormaz.


1
Orada sudo ile çalışan tek komutlar sudo trueve sudo -k. İkincisi açıkça bir şifre gerektirmez. Komut dosyasındaki diğer komutların hiçbiri sudo ile çalışmadığından, kimlik doğrulamanın ilk kez başarılı olup olmadığına bakılmaksızın elbette parola gerektirmezler.
ilkkachu

Ben yazdım: "Bu durumda sudo ile herhangi bir komut çalıştırmaları gerekiyorsa, ilk başta denetler, parolayı sadece bir kez sorar."
Luciano Andress Martini
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.