Какова цель «true» в bash «если sudo true; тогда"


20

Я взломал этот скрипт bash, который проверяет, есть ли у пользователя привилегии суперпользователя, и если он этого не делает, он запрашивает их. В конечном итоге я пытаюсь инвертировать второе выражение «if», чтобы можно было удалить следующие две строки (эхо «пароль в порядке» и остальное в следующей строке)

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

Является ли цель «true» в четвертой строке просто нулевым утверждением?

Мне нужно инвертировать тест на четвертой строке, как мне это сделать? Вот что я попробовал:

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

2
Если вы собираетесь понизить вопрос, не могли бы вы объяснить, что я могу сделать, чтобы улучшить вопрос? Разве это не правильный сайт переполнения?
Мэтт Паркинс

4
Не уверен, откуда исходят отрицательные голоса; Вы пытаетесь опровергнуть утверждение или аннулировать утверждение? Вы говорите, что хотите избавиться как от истины / эха, так и от «другого», так какова ваша конечная цель?
Джефф Шаллер


1
@ ctrl-alt-delor, следуя этой ссылке, кажется, все, что мне нужно сделать, это поставить восклицательный знак перед sudo, а затем я могу удалить как echo, так и else, и теперь я проверил это, это работает, спасибо.
Мэтт Паркинс

2
Попутно, вы, вероятно, должны перенаправить сообщение об ошибке в поток ошибок:echo "Aborting script" >&2
Toby Speight

Ответы:


38

trueв bash это не ключевое слово, это программа, которая мгновенно завершает работу с успешным кодом выхода. Аналогично, falseэто программа, которая завершается с неудачным кодом выхода.

Вы можете попробовать это, запустив обе программы с вашего терминала, а затем прочитав $?переменную, которая содержит код завершения последней программы;

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

if sudo trueне является эквивалентом if sudo == true. if sudo trueзапускает trueпрограмму с использованием sudoи проверяет код выхода.

Следовательно:

if sudo false; thenзапускает программу falseкак sudo. Возвращение всегда будет ложным.

if sudo true == falseзапустим программу trueс аргументами ==и falseс помощью sudo. Это явно не так, как вы хотели.

if [!(sudo true)] неверный синтаксис

То, что вы, вероятно, ищете

if ! sudo true;

12
В слегка педантичной поправке к первому предложению: в ударе , trueи falseявляются «» встроенными командами, команда интерпретируется непосредственно оболочка; в Unix-подобных системах в целом они также существуют как отдельные программы в файловой системе. Разница здесь не так важна, но, насколько я знаю, sudo trueбудет запускаться отдельная программа, а не встроенная команда bash.
IMSoP

31
PS: мои любимые резюме trueи falseназвания на их страницах true - do nothing, successfullyfalse - do nothing, unsuccessfully
руководства

3
@IMSoP Это глубоко.
мозговой заговор

2
Если trueэтого не было, то код в вопросе показывает, почему нужно его изобретать! Это минимальная программа, которая может потерпеть неудачу только в том случае, если система, на которой она работает, действительно работает. Таким образом, можно использовать его, чтобы установить, в порядке ли учетные данные доступа.
nigel222

2
В AT & T SYSV Unix «true» представлял собой скрипт оболочки / bin / true, который состоял из большого уведомления об авторских правах в комментариях ... и ничего более.
Ли Даниэль Крокер

21

Я чувствую, что принятый ответ на самом деле не ответил на ваш вопрос?

Цель сделать это , чтобы убедиться , что вы можете на самом деле sudo.

Как эта проверка выполняется через trueпрограмму, как объяснено в принятом ответе.


1
По сути, это. Альтернативой может быть проверка того, находится ли пользователь в группе sudoers, но просто запустить sudo trueего также достаточно просто, хотя и немного странно.
Сергей Колодяжный

3
Обратите внимание, что это также требует sudoустановки, чтобы проверки не были полностью эквивалентны ... вы можете быть в группе sudoers и все еще не иметь возможности sudo. (Это может особенно подойти, если вы, например, пишете скрипт для установки нового образа из минимального архива rootfs, который может не иметь sudo.)
Mehrdad

1
ОП хочет бросить, если вы не можете sudo, и избавиться от двух строк, вместо того, чтобы иметь еще один после noop.
Маккензм

2
И, наоборот, вы также можете иметь возможность, sudoне входя в группу sudoers, если вы (лично или как член какой-либо другой группы) перечислены в /etc/sudoers. Но даже sudo trueэто не является непогрешимым, поскольку sudoдоступ может быть предоставлен только для определенных команд, так что вы можете sudo true, но не можете sudo something_else, или наоборот. Нет никакого железного способа тестирования, кроме как попыткой запустить команду, которую вы на самом деле хотите запустить sudo.
Дейв Шерохман

2
Кроме того, вы можете быть в sudoersгруппе и не сможете, sudoпотому что sudoersгруппа не указана в sudoersфайле. Группа с четырьмя буквами sudoв названии не является достоверным показателем того, может ли пользователь в этой группе делать какие-либо конкретные вещи или что-либо вообще с их помощью sudo.
jrw32982 поддерживает Монику

5

Как я вижу в этом сценарии. Это просто проверка, включен ли sudo, вот и все.

истина просто возвращает истину.

Так что в этом случае, если им нужно выполнить какую-либо команду с помощью sudo, она сначала проверяется при запуске, запрашивая пароль только один раз.

Условие работает следующим образом: если sudo правильно выполняет команду true, оно возвращает true для условия if, тогда sudo включен, и пользователь ввел пароль правильно, иначе вы ввели неверный пароль или sudo не включен, сценарий не должен продолжаться.

Другим командам не нужно запрашивать пароль sudo, потому что ваша аутентификация проходит успешно в первый раз (но это зависит от конфигурации sudo, поэтому сценарии сильно зависят от конфигурации среды)

'Echo password ok' также демонстрирует это. сценарий оболочки больше не будет спрашивать пароль.


1
Единственные команды, которые запускаются через sudo, это sudo trueи sudo -k. Последний явно не требует пароля. Ни одна из других команд в скрипте не запускается через sudo, поэтому, конечно, они не будут требовать пароли, независимо от того, была ли аутентификация успешной в первый раз.
Ильккачу

Я написал: «Так что в этом случае, если им нужно выполнить какую-либо команду с помощью sudo, она сначала проверяется при запуске, запрашивая пароль только один раз»,
Лучано Андресс Мартини,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.