我努力通过ssh用mailx发送电子邮件。这是用例。我正在编写一个小型部署脚本,并希望在最后发送自定义电子邮件。由于我们的开发机器不能直接发送电子邮件,我想通过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嵌套命令,我无法找到正确的组合。
任何帮助表示感谢。
答案 0 :(得分:0)
您可以使用heredocs将整个脚本动态地提供给远程/bin/sh
的stdin:
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