1

我正在努力通过带有mailx的ssh发送电子邮件。这是用例。我正在编写一个小型部署脚本,并希望在最后发送一封自定义电子邮件。由于我们的开发机不能直接发送邮件,所以我想到了通过 ssh 使用集成机来完成这项工作。在脚本中,收件人、主题和电子邮件内容都存储在变量中。内容是用 Markdown 编写的,因为它在项目中作为变更日志提交。

这是我尝试过的命令:

ssh user@host "echo -e ${CHANGELOG_CONTENT} | mailx -s \"${PROJECT_NAME} - ${TARGET_VERSION} - ${RELEASE_DATE}\" ${CHANGELOG_RECIPIENTS}"

在此之前我尝试了几种变体,但没有运气。这个版本给了我这个错误:

bash: -c: line 0: syntax error near unexpected token `('

这是一个命令示例,其中变量替换为它们的内容(手工制作):

ssh user@host "echo -e Version 1.2\n\n- branch-1 : [gitlab link](http://gitlab.example.com/project-alpha/commits/branch-1)\n\n | mailx -s "Project Alpha - 1.2 - 2015-26-05 13:10" me@example.com you@example.com"

我很确定我的错误来自错误的转义/引用,但由于我使用 SSH 嵌套命令,我找不到正确的组合。

任何帮助表示赞赏。

4

1 回答 1

0

/bin/sh您可以使用 heredocs 动态地将整个脚本提供给远程的标准输入:

ssh user@host /bin/sh <<EOF
mailx -s "${PROJECT_NAME} - ${TARGET_VERSION} - ${RELEASE_DATE}" ${CHANGELOG_RECIPIENTS} <<'END_OF_MAIL_BODY'
${CHANGELOG_CONTENT}
END_OF_MAIL_BODY
EOF

$CHANGELOG_CONTENT请注意,如果包含以 开头的行,它将失败END_OF_MAIL_BODY

顺便说一句,我更喜欢使用sendmail. 它可以更好地控制发送邮件。

ssh user@host /bin/sh <<EOF
sendmail -t <<'END_OF_MAIL_HEADER_AND_BODY'
From: ${CHANGELOG_SENDER}
Subject: ${PROJECT_NAME} - ${TARGET_VERSION} - ${RELEASE_DATE}
Bcc: ${CHANGELOG_RECIPIENTS}

${CHANGELOG_CONTENT}
END_OF_MAIL_HEADER_AND_BODY
EOF
于 2015-05-26T12:48:10.947 回答