Обычно вы устанавливаете ulimit для пользователя, для которого работает служба, как в /etc/security/limits.conf
.
Например, если веб-служба работает как www-data
, вы должны добавить запись для www-data
в /etc/security/limits.conf
установка соответствующих пределов.
Если процесс запускается от имени root
, тогда он будет более сложным, учитывая ограничения в /etc/security/limits.conf
тогда будет применяться ко всем root
процессы.
Одна из проблем с установкой ограничений в /etc/security/limits.conf
заключается в том, что он зависит от процессов, проходящих через стек PAM.
В случае служб и демонов, которые этого не делают, то да, изменение соответствующих сценариев службы является приемлемым подходом. Вероятно, это необходимо делать для каждого процесса, и в зависимости от вашего дистрибутива сценарии запуска службы обычно управляются пакетами, что означает конфликты при каждом обновлении.
Вместо
echo "$input"
попробуйте
eval echo "$input"
Это даже не специфично для bash, работает с / bin / sh!
Обратите внимание, что это представляет серьезную угрозу безопасности, потому что eval
просто выполняет то, что вы ему даете. В этом случае оболочка интерпретирует строку $ input
как $ test
, а затем eval
выполняет echo $ test
. Но что, если пользователь ввел $ test; rm -rf *
? eval
будет представлен с echo $ test; rm -rf *
. Будьте очень осторожны, если сделаете это.
В bash вы можете использовать синтаксис косвенного раскрытия параметров :
test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}
В этом случае пользователь должен предоставить test
только строка без предшествующего знака доллара.
Если вы не возражаете что пользователь может выполнять произвольные команды, включая подстановку команд $ (…)
, вы можете передать строку во встроенную функцию eval
. Обратите внимание, что eval
ожидает фрагмент оболочки, и если входные данные содержат кавычки, они могут вызвать синтаксические ошибки. (Относительно) простой способ справиться с кавычками - использовать здесь документ для выполнения замен. Вы все еще зависите от незавершенной подстановки переменной или команды (например, $ (foo
).
IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}