Мне нужно запустить Bash script, который может отображать 300 строк Groovy script в файл tmp. Какой лучший способ сделать это?
Мое текущее решение помещает файл script онлайн и загружает его.
Мне нужно запустить Bash script, который может отображать 300 строк Groovy script в файл tmp. Какой лучший способ сделать это?
Мое текущее решение помещает файл script онлайн и загружает его.
Используйте синтаксис heredoc для вставки другого script в оболочку script:
cat > file.tmp <<'endmsg'
script goes here...
endmsg
Подход heredoc велик, но вы не можете использовать его наивно:
Это означает, что наивный подход heredoc может преуспеть или потерпеть неудачу в зависимости от точного содержимого, которое вставлено. Это нарушает принцип наименьшего изумления и опасен, поскольку полуслучайный.
Я предпочитаю подход, когда контент сначала захватывается с помощью base64 uuencode. Это устраняет возможность различного поведения в зависимости от контента, поэтому вам больше не придется об этом думать.
Более безопасный подход:
uuencode -m whatever.sh whatever.sh >tmp
Окончательный script выглядит следующим образом:
cat > file.tmp <<'_EOF'
begin-base64 644 whatever.sh
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz
IC1sUgpscyAtbFIK
====
_EOF
uudecode file.tmp
Существует небольшая вероятность того, что любая строка данных uuencoded может соответствовать вашему маркеру heredoc. Вероятно, вы не будете использовать маркеры длиной 60 символов:), но последняя строка может быть короче, и есть вероятность, что содержимое uuencoded может случайно совпасть с вашим маркером, если только маркер не использует символ (например, подчеркивание), который не может произойти в кодировке base64. _EOF
всегда безопасен.
Также рекомендуется указывать маркер heredoc, например '_EOF'
, чтобы предотвратить расширение оболочки в блоке. Я не думаю, что полезная нагрузка, основанная на base64, может когда-либо непреднамеренно ссылаться на переменную оболочки, поскольку $
не используется в base64, но цитирование исключает эту возможность. Это также помогает установить привычку всегда ссылаться на маркер heredoc, если нет причины, по которой вы хотите расширить оболочку. Это другое поведение, зависящее от контента, которое сложно, так как кажется случайным. ВСЕГДА указывайте свой маркер heredoc, если вы не знаете, что хотите расширения оболочки внутри блока контента!
Если вы хотите вывести файл, который требует использования sudo
, ответ совершенно неочевиден!
sudo tee /etc/php/conf.d/xdebug.ini > /dev/null <<'TXT'
zend_extension=xdebug.so
xdebug.remote_enable=on
xdebug.remote_autostart=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
TXT