Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash替换附件的${}占位符_Linux_Bash_Sed_Mime_Postfix Mta - Fatal编程技术网

Linux bash替换附件的${}占位符

Linux bash替换附件的${}占位符,linux,bash,sed,mime,postfix-mta,Linux,Bash,Sed,Mime,Postfix Mta,我一直在尝试使用MIME multipart编码,使用postfix发送纯文本和HTML版本的消息 我在tmp目录中创建了一个temp-email.txt,包含以下内容: From:Sender <xxxx@xxxx.com> To:Recipient <xxxx@xxxx.com> Subject: Result MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MixedBoundaryString"

我一直在尝试使用
MIME multipart
编码,使用
postfix
发送纯文本和
HTML
版本的消息

我在tmp目录中创建了一个temp-email.txt,包含以下内容:

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--
我这里的问题是在替换${attachment}时出现了以下错误

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

提前感谢。

当您在文件上运行命令足够长的时间时

$ 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
命令的结尾不在同一行上

如何解决:

$ 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--
只需删除
\n
,然后使用类似
tr-d'\n'
的命令将其传递给
sed
,这对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 --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>
$base64/tmp/result.txt | tr-d'\n'| base64-解码
1.
TR:V4U0L5\u 9ROSI
gnl | V4U0L5 |非特征蛋白质[智人]OX=393305 GN=CICLE|U v10008136mg PE=4 SV=1
TR:V4U0L5\u 9ROSI
388
测试:

$ 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--
$sed“s/\${attachment}/$(base64/tmpt/result.txt | tr-d'\n')/”电子邮件模板
发件人:发件人
收件人:收件人
主题:结果
MIME版本:1.0
内容类型:多部分/混合;boundary=“MixedBoundaryString”
--混合边界字符串
内容类型:多部分/备选;boundary=“AlternativeBoundaryString”
--交替边界字符串
内容类型:文本/纯文本;字符集=UTF-8
内容传输编码:引用可打印
结果
${detail}
--交替边界字符串
内容类型:text/html;字符集=UTF-8
内容传输编码:引用可打印
结果
${detail}

--交替边界字符串-- --混合边界字符串 内容类型:文本/纯文本 MIME版本:1.0 内容传输编码:base64 内容处置:附件;filename=“${filename}” 4.一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的中国的一个中国的一个中国的中国的一个中国的一个中国的中国的一个中国的一个中国的中国的中国的一个中国的中国的中国的中国的一个中国的一个中国的一个中国的中国的中国的一个中国的中国的中国的中国的中国的中国的一个中国的一个中国的一个中国的一个中国的中国的中国的中国的中国的4 4 4 4 4 4个中国的中国的中国的一个中国的中国的中国的中国的中国的中国的中国的中国的中国的中国的中国的VSGL0x2xLBJ4KPC9IAXQ+Cg== --混合边界字符串--
大致上,您可以使用需要gettext包的envsubst。注意:您所做的与twig类似

示例: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
#/bin/bash
#sudoyum安装gettext
detail=“detail”
filename=“filename”
attach=$(base64/tmp/result.txt)
email=“/report/result.txt”
导出详细信息='somevalue'文件名='someothervalue'附件=“$(echo$attach)”
MYVARS='$detail:$filename:$result:$attachment'
envsubs“$MYVARS”$email

能否添加
文件名
变量的值?和
$1
,最后但并非最不重要的一点是,我在模板中找不到
${result}
,$1只是一个字符串,类似于“验证确定”,FILENAME=“test”,没有附件的sed命令确实有效,只有当我尝试替换${attachment}占位符时才会出现错误。请告诉我这是否适用于您!谢谢如果我的答案解决了你的问题,请点击大复选标记接受(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受并向上投票有助于未来的读者。请参阅[相关帮助中心文章][1][1]:它起作用了,谢谢你,谢谢你的快速回复:)@Allan good solution,我将投票,您是否碰巧看到我的?删除换行符不符合
base64
的建议,并且如果
base64
长度超过约1000字节,将破坏许多服务器上的消息。这也是一个不错的解决方案:)
#!/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