Символическая ссылка на файл jar и службу init.d

TL, DR: экспорт с

export -p >env_var.sh

и импорт с

. env_var.sh

Работает ли ваш код, зависит от формата env_var.txt и какие специальные символы (т.е. символы, которые имеют особое значение в синтаксисе оболочки) присутствуют в именах и значениях переменных.

`cat env_var.txt` - это подстановка команды без кавычек. Если оставить подстановку команды переменной без кавычек, к ней применяется оператор «split + glob»: сначала разделите вывод команды на символы в значении переменной IFS , затем интерпретируйте каждую часть как подстановочный знак имени файла. pattern и замените каждый шаблон, который соответствует некоторым файлам, на имена соответствующих файлов. Результатом является список слов, по которым повторяется цикл for .

Подстановка команд без кавычек редко бывает тем, что вам нужно, и в данном случае это определенно не то, что вам нужно. Однако это работает, если синтаксис файла, например, вывод env и значения переменных не содержат *? \ [ или пробелов .

Если env_var.txt - это результат env , вы можете получить лучшие результаты, если проанализируете его в соответствии с его фактическим синтаксисом (присвоения, разделенные новой строкой), вместо того, чтобы использовать метод синтаксического анализа, который не имеет смысла. Если вы хотите использовать оператор split + glob, что является самым простым способом сделать это, установите IFS только на новую строку и включите сопоставление с подстановочными знаками.

set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS

Однако существует проблема, которую вы не можете решить на стороне получателя: результат env неоднозначен. Учитывая следующее содержание:

foo=bar
hello=world

невозможно определить, есть ли две переменные (одна называется foo со значением bar , а другая называется hello с значение world ) или только тот, который называется foo со значением

bar
hello=world

Чтобы экспортировать переменные среды однозначным образом, не используйте env , используйте экспорт вместо . Команда export -p выводит список значений всех переменных среды, которые могут быть проанализированы оболочкой. Итак, на стороне экспорта запустите

export -p >env_var.sh

На стороне импорта запустите

. env_var.sh

Предостережение: в bash вывод export -p можно анализировать, но только с помощью bash. Чтобы получить результат, работающий в других оболочках в стиле sh, установите для POSIXLY_CORRECT любое значение.Это не оказывает вредного воздействия на другие оболочки, поэтому вы можете просто выполнить

(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh

Установка для POSIXLY_CORRECT значения, которое у него было раньше, не влияет на вывод - либо его не было в среде и его не будет после запуска этого, или он был в среде, и его значение не изменилось. Но этого достаточно, чтобы заставить bash использовать переносимый синтаксис с export в выводе export -p , а не специфичный для bash синтаксис с declare .

Обратите внимание, что импорт переменных среды может привести к выполнению произвольного кода, поэтому убедитесь, что вы импортируете только env_var.txt или env_var.sh из источника, которому вы доверяете. Виной всему переменные окружения, а не . env_var.sh выполняет код: простой импорт таких переменных, как PATH , LD_PRELOAD , ENV и т. д., может привести к выполнению кода в дальнейшем. .

1
21.08.2018, 02:41
1 ответ

Для запуска приложения не нужно связывать jar-файл. Бинарный файл, который вы хотите запустить, - это java с файлом jar в качестве аргумента. Для этого вам нужно создать файл инициализации (или файл модуля sysyemd вашей системы, использующий systemd ). Сценарий должен обрабатывать как минимум аргумент start и stop для запуска и остановки вашего приложения. Затем в начале будет установлен ваш дом java и другие элементы, необходимые вашему приложению, а затем запущена команда java. Существует ряд доступных шаблонов для сценариев инициализации, которые вы можете использовать.

2
27.01.2020, 23:33

Теги

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