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
echo "Aborting script" >&2
Odpowiedzi:
true
w bash nie jest słowem kluczowym, to program, który natychmiast kończy działanie z pomyślnym kodem wyjścia. Podobniefalse
jest 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;if sudo true
nie jest równoważne zif sudo == true
.if sudo true
uruchamiatrue
program za pomocąsudo
i sprawdza kod wyjścia.W związku z tym:
if sudo false; then
uruchamia programfalse
jako sudo. Zwrot zawsze będzie fałszywy.if sudo true == false
uruchomi programtrue
z argumentami==
ifalse
przy użyciusudo
. To oczywiście nie jest zamierzone.if [!(sudo true)]
jest niepoprawną składnią.To, czego prawdopodobnie szukasz
źródło
true
ifalse
są „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 true
będzie działał samodzielny program, a nie wbudowany bash.true
ifalse
tytuły na ich stronachtrue - do nothing, successfully
false - do nothing, unsuccessfully
true
nie 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.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
true
programu, zgodnie z wyjaśnieniem w zaakceptowanej odpowiedzi.źródło
sudo true
jest również dość łatwe, choć nieco hackerskie.sudo
instalacji, 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.)sudo
nie będąc w grupie sudoers, jeśli jesteś (osobiście lub jako członek innej grupy) wymieniony w/etc/sudoers
. Ale nawetsudo true
nie jest nieomylny, ponieważsudo
dostęp można przyznać tylko dla określonych poleceń, więc możeszsudo true
, ale nie możeszsudo something_else
, i odwrotnie. Nie ma innego, żelaznego sposobu na przetestowanie, jak próba uruchomienia polecenia, które faktycznie chcesz uruchomićsudo
.sudoers
grupie i nie możesz,sudo
ponieważsudoers
grupy nie ma na liście wsudoers
pliku. Grupa z czterema literamisudo
w nazwie nie jest prawidłowym wskazaniem, czy użytkownik w tej grupie może robić jakąkolwiek konkretną rzecz lub cokolwieksudo
.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.
źródło
sudo true
isudo -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.