Jaki jest cel „true” w bash „jeśli sudo true; następnie"

20

Zhakowałem razem ten skrypt bash, który sprawdza, czy użytkownik ma uprawnienia administratora, a jeśli nie, prosi o nie. W końcu próbuję odwrócić drugą instrukcję „if”, aby móc usunąć następujące dwie linie (echo „hasło ok” i pozostałe w kolejnej linii)

# 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"

Czy cel „prawda” w czwartym wierszu jest po prostu wyrażeniem zerowym?

Muszę odwrócić test na czwartym wierszu, jak to zrobić? Oto, co próbowałem:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then
Matt Parkins
źródło
2
Jeśli zamierzasz zanegować pytanie, czy możesz wyjaśnić, co mogę zrobić, aby poprawić pytanie? Czy to nie jest odpowiednia witryna z przepełnieniem?
Matt Parkins
4
Nie jestem pewien, skąd pochodzą opinie negatywne; próbujesz zanegować instrukcję lub unieważnić ją? Mówisz, że chcesz pozbyć się zarówno prawdy / echa, jak i „else”, więc jaki jest twój ostateczny cel?
Jeff Schaller
1
patrz stackoverflow.com/q/10552711/537980
ctrl-alt-delor
1
@ ctrl-alt-delor po tym linku wydaje się, że wszystko, co muszę zrobić, to umieścić wykrzyknik przed sudo, a następnie mogę usunąć zarówno echo, jak i inne, a teraz przetestowałem to, dziękuję.
Matt Parkins
2
Na marginesie, prawdopodobnie powinieneś przekierować komunikat o błędzie do strumienia błędów:echo "Aborting script" >&2
Toby Speight

Odpowiedzi:

38

truew bash nie jest słowem kluczowym, to program, który natychmiast kończy działanie z pomyślnym kodem wyjścia. Podobnie falsejest to program, który kończy działanie z nieudanym kodem wyjścia.

Możesz to wypróbować, uruchamiając oba programy z terminala, a następnie czytając $?zmienną, która zawiera kod wyjścia ostatniego programu;

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

if sudo truenie jest równoważne z if sudo == true. if sudo trueuruchamia trueprogram za pomocą sudoi sprawdza kod wyjścia.

W związku z tym:

if sudo false; thenuruchamia program falsejako sudo. Zwrot zawsze będzie fałszywy.

if sudo true == falseuruchomi program truez argumentami ==i falseprzy użyciu sudo. To oczywiście nie jest zamierzone.

if [!(sudo true)] jest niepoprawną składnią.

To, czego prawdopodobnie szukasz

if ! sudo true;
JShorthouse
źródło
12
Jako nieco pedantyczna poprawka do pierwszego zdania: w bash , truei falsesą „wbudowanymi”, poleceniami interpretowanymi bezpośrednio przez powłokę; ogólnie w systemach uniksowych istnieją one również jako samodzielne programy w systemie plików. Różnica nie ma tutaj większego znaczenia, ale o ile wiem, sudo truebędzie działał samodzielny program, a nie wbudowany bash.
IMSoP
31
PS: moje ulubione streszczenia truei falsetytuły na ich stronach true - do nothing, successfullyfalse - do nothing, unsuccessfully
podręcznika
3
@IMSoP To głębokie.
wykres mózgowy
2
Jeśli truenie istniał, kod w pytaniu pokazuje, dlaczego trzeba go wymyślić! Jest to minimalny program, który może zawieść tylko wtedy, gdy system, na którym jest uruchomiony, jest naprawdę uszkodzony. Można go więc użyć do ustalenia, czy dane dostępowe są prawidłowe.
nigel222
2
W AT&T SYSV Unix „true” był skryptem powłoki / bin / true, który składał się z dużej uwagi o prawach autorskich w komentarzach ... i nic więcej.
Lee Daniel Crocker
21

Wydaje mi się, że zaakceptowana odpowiedź tak naprawdę nie odpowiedziała na twoje pytanie?

Celem tego rozwiązania jest to, aby sprawdzić, czy rzeczywiście można sudo.

Sposób przeprowadzania tej kontroli odbywa się za pośrednictwem trueprogramu, zgodnie z wyjaśnieniem w zaakceptowanej odpowiedzi.

Mehrdad
źródło
1
Zasadniczo to. Alternatywą może być sprawdzenie, czy użytkownik jest w grupie sudoers, ale samo uruchomienie sudo truejest również dość łatwe, choć nieco hackerskie.
Sergiy Kolodyazhnyy
3
Zauważ, że wymaga to również sudoinstalacji, więc kontrole nie byłyby całkowicie równoważne ... możesz być w grupie sudoers i nadal nie będziesz w stanie sudo. (Może się to szczególnie pojawić, jeśli np. Piszesz skrypt, aby skonfigurować nowy obraz z minimalnego tarballa rootfs, który może nie mieć sudo.)
Mehrdad
1
OP chce zrezygnować, jeśli nie możesz sudo, i pozbyć się dwóch linii zamiast mieć inną po noopie.
mckenzm
2
I odwrotnie, możesz również być w stanie, sudonie będąc w grupie sudoers, jeśli jesteś (osobiście lub jako członek innej grupy) wymieniony w /etc/sudoers. Ale nawet sudo truenie jest nieomylny, ponieważ sudodostęp można przyznać tylko dla określonych poleceń, więc możesz sudo true, ale nie możesz sudo something_else, i odwrotnie. Nie ma innego, żelaznego sposobu na przetestowanie, jak próba uruchomienia polecenia, które faktycznie chcesz uruchomić sudo.
Dave Sherohman
2
Ponadto możesz być w sudoersgrupie i nie możesz, sudoponieważ sudoersgrupy nie ma na liście w sudoerspliku. Grupa z czterema literami sudow nazwie nie jest prawidłowym wskazaniem, czy użytkownik w tej grupie może robić jakąkolwiek konkretną rzecz lub cokolwiek sudo.
jrw32982 obsługuje Monikę
5

Jak widzę w tym skrypcie. Sprawdza tylko, czy sudo jest włączone, to znaczy ..

true po prostu zwraca true.

Więc w tym przypadku, jeśli trzeba uruchomić dowolne polecenie za pomocą sudo, najpierw sprawdza na początku, pytając o hasło tylko raz.

Warunek działa w ten sposób: jeśli sudo poprawnie wykona polecenie true, zwróci wartość true dla warunku if, wówczas sudo jest włączone, a użytkownik wpisał hasło poprawnie, w przeciwnym razie hasło jest źle wpisane lub sudo nie jest włączone, skrypt nie wolno kontynuować.

Inne polecenia nie muszą pytać o hasło sudo, ponieważ uwierzytelnianie jest udane za pierwszym razem (ale zależy to od konfiguracji sudo, więc skrypty te zależą w dużej mierze od konfiguracji środowiska)

„Echo hasła OK” również to pokazuje. skrypt powłoki nie będzie już pytał o hasło.

Luciano Andress Martini
źródło
1
Jedynymi poleceniami uruchamianymi przez sudo są sudo truei sudo -k. Ten ostatni nie wymaga hasła. Żadne z pozostałych poleceń w skrypcie nie jest uruchamiane przez sudo, więc oczywiście nie będą wymagały haseł, niezależnie od tego, czy uwierzytelnienie zakończyło się pomyślnie za pierwszym razem.
ilkkachu
Napisałem: „W takim przypadku, jeśli trzeba uruchomić dowolne polecenie za pomocą sudo, najpierw sprawdza na początku, pytając o hasło tylko raz”.
Luciano Andress Martini