Во-первых, xargs
не может работать здесь, потому что замены были бы выполнены в подпроцессе ( bash
процессы это xargs
запуски). Но только переменные среды передаются подпроцессам, не окружают переменные. Очевидно HOSTNAME
уже был в среде Вашего сценария, когда она запустилась, но HOSTADDRESS
не. В этой точке Вы могли бы испытать желание экспортировать все переменные, но даже затем xargs
не хорошее решение, потому что оно страдает от многочисленного − проблем заключения в кавычки, если Ваш шаблон содержит \"'
или если Вы хотите сохранить пробел, Вы - тост.
Теперь, смотря на Ваш текущий код: MESSAGE=`eval echo $TEMPLATE`
сложный способ записать eval MESSAGE=$TEMPLATE
, за исключением заключения в кавычки проблем. И у Вас действительно есть проблемы заключения в кавычки; например, Вы заметите, что весь Ваш пробел был свернут. Вы услышали о Bobby Tables, не так ли? Правила расширения Shell довольно сложны, но существуют некоторые правила, это сохранит Вас нормальными:
"$foo"
и замены команды "$(bar)"
. Можно нарушить это правило, если Вы понимаете, почему необходимо опустить кавычки.$(…)
вместо `…`
для замен команды. Заключение в кавычки в форме одинарной левой кавычки является тайным и не портативным, тогда как заключение в кавычки внутри $(…)
работы обычно.eval
только если нажатый под прицелом. Если Вы делаете, очень осторожны, и делаете его максимально простым.Таким образом, что может пойти не так, как надо с eval MESSAGE="$TEMPLATE"
? Это заставляет оболочку оценить
MESSAGE=Hostname : $HOSTNAME
Host Address : $HOSTADDRESS
Ой, нам нужны кавычки вокруг части, которая должна быть значением MESSAGE
. Кавычки должны добраться до eval
, таким образом, они должны пойти буквально через первую стадию расширения оболочки: eval MESSAGE="\"$TEMPLATE\""
.
MESSAGE="Hostname : $HOSTNAME
Host Address : $HOSTADDRESS"
Лучше, но теперь у Вас есть точно шаблон инжекции Bobby Tables — что, если шаблон содержит кавычку? Затем необходимо выйти из кавычек. Четыре символа, которые имеют особое значение между двойными кавычками, \"$`
, и Вы хотите $
для сохранения его значения поэтому добавьте обратную косую черту перед другими тремя.
TEMPLATE=$(sed -e 's/[\\"`]/\\&/g'
Теперь оболочка оценит
MESSAGE="Hostname : $HOSTNAME
Host Address : $HOSTADDRESS
Name : Bobby \"drop\" O'Tables"
и все хорошо.
Обратите внимание, что надлежащее заключение в кавычки здесь должно защитить от случайных проблем парсинга; кто бы ни управляет шаблоном, все еще имеет доступ оболочки (с $(hello)
).
Если бы Вы хотели шаблон, включенный в Ваш сценарий оболочки, то это было бы естественно сделано с heredoc.
MESSAGE=$(cat <
Но с внешним шаблоном необходимо было бы сделать два шага оценки, следовательно использовать eval
, и парсинг удара довольно ошибочен когда дело доходит до броского материала как heredocs внутри eval
. Существует, конечно, путь, который работает, по крайней мере, с ударом 4, но я не рекомендую рискнуть им.
Существует несколько методов:
Удалите исполняемые файлы, которые Вы хотите ограничить от локальной системы хранения на всех рабочих станциях и сделать их доступными только на сетевом диске, которым Вы управляете
Используйте политику SELinux ограничить выполнение на рабочую станцию
Предельный доступ к портам, IP-адресам или другим ресурсам, что незаконным исполняемым файлам нужны прокси использования или просто iptables
Ни один из этих методов не будет эффективным без первой реализации хорошо объясненного соглашения о политике использования, что пользователи должны подписаться.