Сценарий оболочки Linux: Разрешить пользователю указывать имена переменных в приглашении ввода

Обычно вы устанавливаете ulimit для пользователя, для которого работает служба, как в /etc/security/limits.conf .

Например, если веб-служба работает как www-data , вы должны добавить запись для www-data в /etc/security/limits.conf установка соответствующих пределов.

Если процесс запускается от имени root , тогда он будет более сложным, учитывая ограничения в /etc/security/limits.conf тогда будет применяться ко всем root процессы.

Одна из проблем с установкой ограничений в /etc/security/limits.conf заключается в том, что он зависит от процессов, проходящих через стек PAM.

В случае служб и демонов, которые этого не делают, то да, изменение соответствующих сценариев службы является приемлемым подходом. Вероятно, это необходимо делать для каждого процесса, и в зависимости от вашего дистрибутива сценарии запуска службы обычно управляются пакетами, что означает конфликты при каждом обновлении.

5
23.05.2017, 15:39
3 ответа

Вместо

echo "$input"

попробуйте

eval echo "$input"

Это даже не специфично для bash, работает с / bin / sh!

Обратите внимание, что это представляет серьезную угрозу безопасности, потому что eval просто выполняет то, что вы ему даете. В этом случае оболочка интерпретирует строку $ input как $ test , а затем eval выполняет echo $ test . Но что, если пользователь ввел $ test; rm -rf * ? eval будет представлен с echo $ test; rm -rf * . Будьте очень осторожны, если сделаете это.

4
27.01.2020, 20:37

В bash вы можете использовать синтаксис косвенного раскрытия параметров :

test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}

В этом случае пользователь должен предоставить test только строка без предшествующего знака доллара.

2
27.01.2020, 20:37

Если вы не возражаете что пользователь может выполнять произвольные команды, включая подстановку команд $ (…) , вы можете передать строку во встроенную функцию eval . Обратите внимание, что eval ожидает фрагмент оболочки, и если входные данные содержат кавычки, они могут вызвать синтаксические ошибки. (Относительно) простой способ справиться с кавычками - использовать здесь документ для выполнения замен. Вы все еще зависите от незавершенной подстановки переменной или команды (например, $ (foo ).

IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}
1
27.01.2020, 20:37

Теги

Похожие вопросы