bash заменит $ {} заполнитель для вложения - PullRequest
0 голосов
/ 05 июня 2018

Я пытался использовать кодировку MIME-multipart для отправки как обычного текста, так и HTML версии сообщения, используя postfix.

Я создал файл temp-email.txt вКаталог tmp со следующим содержимым:

From:Sender <xxxx@xxxx.com>
To:Recipient <xxxx@xxxx.com>
Subject: Result
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="MixedBoundaryString"

--MixedBoundaryString
Content-Type: multipart/alternative; boundary="AlternativeBoundaryString"

--AlternativeBoundaryString
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Result

${detail}

--AlternativeBoundaryString
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<html>
  <head>
</head>
  <body>
    <h1>Result</h1>
      <p>${detail}</p>
  </body>
</html>
--AlternativeBoundaryString--
--MixedBoundaryString
Content-Type: text/plain
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="${filename}"

${attachment}

--MixedBoundaryString--

И у меня есть скрипт bash, который заменяет ${} заполнителей в temp-email.txt.

Ниже приведена часть моего скрипта bash:

ATTACHMENT=$(base64 /tmp/result.txt)
EMAIL="/report/result.txt"

sed -e "s/\${result}/$1/" \
    -e "s/\${attachment}/$ATTACHMENT/" \
    -e "s/\${filename}/$FILENAME/" temp-email > $EMAIL

Моя проблема в том, что я получил следующую ошибку при замене $ {attachment}

sed: -e expression #2, char 92: unterminated `s' command

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Грубо говоря, вы можете использовать envsubst, который требует пакет gettext.Примечание: то, что вы делаете, похоже на веточку.

Пример: набор из 3 переменных

#!/bin/bash
#  sudo yum install gettext
detail="DETAIL"
filename="FILENAME"
attach=$(base64 /tmp/result.txt)
email="/report/result.txt"

export detail='somevalue' filename='someothervalue' attachment="$(echo $attach)"
MYVARS='$detail:$filename:$result:$attachment'

envsubst "$MYVARS" < temp-email > $email
0 голосов
/ 05 июня 2018

Когда вы запускаете команду для файла, достаточно длинного

$ base64 /tmp/result.txt 

, он выдаст такой вывод:

PEhpdD4KICAgPEhpdF9udW0+MTwvSGl0X251bT4KICAgPEhpdF9pZD5UUjpWNFUwTDVfOVJPU0k8
L0hpdF9pZD4KICAgPEhpdF9kZWY+Z25sfFY0VTBMNXwgVW5jaGFyYWN0ZXJpemVkIHByb3RlaW4g
W0hvbW8gc2FwaWVuXSBPWD0zOTMzMDUgR049Q0lDTEVfdjEwMDA4MTM2bWcgUEU9NCBTVj0xPC9I
aXRfZGVmPgogICA8SGl0X2FjY2Vzc2lvbj5UUjpWNFUwTDVfOVJPU0k8L0hpdF9hY2Nlc3Npb24+
CiAgIDxIaXRfbGVuPjM4ODwvSGl0X2xlbj4KPC9IaXQ+Cg==

Этот вывод содержит EOL символов, которые будут прервите вашу команду:

 -e "s/\${attachment}/PEhpdD4KICAgPEhpdF9udW0+MTwvSGl0X251bT4KICAgPEhpdF9pZD5UUjpWNFUwTDVfOVJPU0k8
L0hpdF9pZD4KICAgPEhpdF9kZWY+Z25sfFY0VTBMNXwgVW5jaGFyYWN0ZXJpemVkIHByb3RlaW4g
W0hvbW8gc2FwaWVuXSBPWD0zOTMzMDUgR049Q0lDTEVfdjEwMDA4MTM2bWcgUEU9NCBTVj0xPC9I
aXRfZGVmPgogICA8SGl0X2FjY2Vzc2lvbj5UUjpWNFUwTDVfOVJPU0k8L0hpdF9hY2Nlc3Npb24+
CiAgIDxIaXRfbGVuPjM4ODwvSGl0X2xlbj4KPC9IaXQ+Cg==/"

и выдайте ошибку:

sed: -e expression #2, char 92: unterminated `s' command

, поскольку конец команды s находится не на той же строке.

Как ее решить:

Просто удалите \n перед передачей его в sed с помощью команды, подобной tr -d'\n', это не повлияет на декодирование base64

пример:

$ cat /tmp/result.txt 
<Hit>
   <Hit_num>1</Hit_num>
   <Hit_id>TR:V4U0L5_9ROSI</Hit_id>
   <Hit_def>gnl|V4U0L5| Uncharacterized protein [Homo sapien] OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
   <Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
   <Hit_len>388</Hit_len>
</Hit>

используйте

base64 /tmp/result.txt  | tr -d '\n'

, если вы расшифруете его снова:

$ base64 /tmp/result.txt | tr -d '\n' | base64 --decode
<Hit>
   <Hit_num>1</Hit_num>
   <Hit_id>TR:V4U0L5_9ROSI</Hit_id>
   <Hit_def>gnl|V4U0L5| Uncharacterized protein [Homo sapien] OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
   <Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
   <Hit_len>388</Hit_len>
</Hit>

ТЕСТ:

$ sed "s/\${attachment}/$(base64 /tmpt/result.txt| tr -d '\n')/" email_template 
From:Sender <xxxx@xxxx.com>
To:Recipient <xxxx@xxxx.com>
Subject: Result
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="MixedBoundaryString"

--MixedBoundaryString
Content-Type: multipart/alternative; boundary="AlternativeBoundaryString"

--AlternativeBoundaryString
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Result

${detail}

--AlternativeBoundaryString
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<html>
  <head>
</head>
  <body>
    <h1>Result</h1>
      <p>${detail}</p>
  </body>
</html>
--AlternativeBoundaryString--
--MixedBoundaryString
Content-Type: text/plain
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="${filename}"

PEhpdD4KICAgPEhpdF9udW0+MTwvSGl0X251bT4KICAgPEhpdF9pZD5UUjpWNFUwTDVfOVJPU0k8L0hpdF9pZD4KICAgPEhpdF9kZWY+Z25sfFY0VTBMNXwgVW5jaGFyYWN0ZXJpemVkIHByb3RlaW4gW0hvbW8gc2FwaWVuXSBPWD0zOTMzMDUgR049Q0lDTEVfdjEwMDA4MTM2bWcgUEU9NCBTVj0xPC9IaXRfZGVmPgogICA8SGl0X2FjY2Vzc2lvbj5UUjpWNFUwTDVfOVJPU0k8L0hpdF9hY2Nlc3Npb24+CiAgIDxIaXRfbGVuPjM4ODwvSGl0X2xlbj4KPC9IaXQ+Cg==

--MixedBoundaryString--
...