Я пытаюсь проверить, позволил ли текущий пользователь одному из двух разрешить пользователям запускать процесс, но я не могу заставить работать несколько условий правильно:

test ($(whoami) != 'mpurcell' || $(whoami) != 'root')) && (echo "Cannot start script as non-ccast user..."; exit 1)

Есть ли способ протестировать несколько пользователей без необходимости вводить две строки, например так:

test $(whoami) != 'mpurcell' && (echo "Cannot start script as non-ccast user..."; exit 1)
test $(whoami) != 'root' && (echo "Cannot start script as non-ccast user..."; exit 1)

3 ответа3

4

В bash 3.x и выше есть оператор совпадения с регулярным выражением =~ доступный в операторе [[

if [[ ! "$(whoami)" =~ ^(mpurcell|root)$ ]]
then
    echo "Go away" >&2
    exit 1
fi

так далее...

Я читал, что правила цитирования для регулярного выражения изменились в Bash 3.2 или около того. Вышеописанное работает на моем 3.2.25, вам может потребоваться процитировать его, если ваш bash старше.

2

test - это просто команда, поэтому ее выражение анализируется так же, как аргументы любой другой команды - это означает, что скобки, каналы и т. д. должны быть экранированы или заключены в кавычки для работы (и во избежание проблем с этим test использует -o вместо ||). Если вы на самом деле используете bash, у него есть тестовое выражение [[ ]] которое позволяет избежать этих странностей.

Кроме того, логика вашего выражения отключена. Вы сообщаете об ошибке, если текущий пользователь не mpurcell или не root; так как текущий пользователь не может быть и тем и другим, он всегда выдаст ошибку. Я уверен, что вы хотите и там.

Наконец, так как у вас есть echo ...; exit 1 часть 1 в скобках, она будет выполнена в подоболочке, и, следовательно, команда exit завершит подоболочку, а не сценарий. Чтобы избежать этого, используйте { ... } вместо скобок.

Вот версия Bash:

[[ $(whoami) != 'mpurcell' && $(whoami) != 'root' ]] && { echo "Cannot start script as non-ccast user..."; exit 1; }

А вот версия, которая должна работать в универсальной оболочке POSIX:

test "$(whoami)" != 'mpurcell' -a "$(whoami)" \!= 'root' && { echo "Cannot start script as non-ccast user..."; exit 1; }
0

Попробуйте: [$(whoami)!= 'mpurcell' -a $(whoami)!= 'root'] && (echo "Невозможно запустить скрипт как пользователь без ccast ..."; выход 1)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .