如何使用 bash 中的变量通过 sendmail 输出到文件和邮件正文

如何使用 bash 中的变量通过 sendmail 输出到文件和邮件正文

这个想法是通过 Plesk 自动化 WordPress 安装。

我已经设置了 Plesk,并使用 cronjob 每天早上从 wordpress.com 下载 latest.tar.gz 并提取它,现在我正在尝试使数据库创建方面的事情自动化。

我有以下 bash 脚本:

#!/bin/bash/

#To whoever is working on this
#this script simply sets up the DATABASE for the new domain added to the server
#it then logs it, mails the details and clears the log


genpasswd() {
 local pass=`cat /dev/urandom | tr -cd "[:punct:]" | head -c 2`
    echo "$pass"
}

echo $NEW_DOMAIN_NAME >> /usr/games/newdomain.txt
DOMAINNAME=`echo $NEW_DOMAIN_NAME | grep -oE '/[^/]+' | cut -c6- | rev | cut -c4- | rev`
rndChr=$(genpasswd)

CHAR2=${$DOMAINNAME:1:1}
CHAR4=${$DOMAINNAME:3:1}

echo $CHAR2$CHAR4 >> /usr/games/passChar.txt

#get our db stuff
DATABASENAME='exsite_'$DOMAINNAME
DATABASEUSER='exsite_'$DOMAINNAME
DATABASEPASS='[exSite_'$CHAR2$rndChr$CHAR4']'


#create our mail content
CONTENTS="<strong>New MySQL Database created</strong> - <i>see the login details below.<i><p><strong>dbname</strong>    $DATABASENAME<br><strong>dbuser</strong>    $DATABASEUSER<br><strong>dbpass<strong> $DATABASEPASS"

#log it
echo -e $CONTENTS > /usr/games/dbLog.txt


#mail it
sendMail() {
cat << 'EOF' - /usr/games/dbLog.txt | /usr/sbin/sendmail -t
To: [email protected]
From: Enterprise
Reply-to: [email protected]
Subject: [DB Info] for $NEW_DOMAIN_NAME on enterprise.exsite.co
Content-Type: text/html

EOF

printf "STATUS: Mail sent!"

}

if [[ $(sendMail) ]]
then 
    printf "STATUS: Doing mail thing!"
else
    printf "STATUS: MAIL-FAIL!!"
fi

#clear dbLog.txt
exit

出现了两个问题,但我不明白为什么;

CHAR2 和 CHAR4 变量似乎没有拾取 $DOMAINNAME 的第 2 个和第 4 个字符 - 它们只是将空内容输出到 passChat.txt 中

$NEW_DOMAIN_NAME 转到 newdomain.txt,但下一行我尝试仅返回二级域名时似乎失败了。以前它可以工作,但现在不行了。不过我还没有更改那部分。

答案1

假设您想要获取“mydomain”,无论您给出的是以下任何一个:“mydomain.com”、“www.mydomain.com”、“mail.secure.mydomain.com”……

get_domain_name() {
    local IFS=.
    set -- $1
    local n=$(($# - 1))
    echo ${!n}
}

get_domain foo.bar.baz.qux
baz

检查函数结果的正确方法sendmail是使用更少的语法:

if sendmail
then echo OK
else echo uh oh
fi

if检查命令的退出状态。请注意,这[[是 bash 内置命令(要求其最后一个参数为]])--在 bash 提示符下,键入help [[ if


在您的sendmail函数中,您使用cat << 'EOF'-- 有效地将整个 here-doc 单引号括起来。任何变量都将不是被替代。

您似乎想要连接 heredoc,然后连接 stdin,然后连接命名文件,然后将所有这些通过管道传输到 sendmail。您需要更多的语法才能做到这一点:使用括号{ grouping }连接信息,然后将结果通过管道传输到 sendmail

sendMail() {
    {
        cat <<- HEADERS
            To: [email protected]
            From: Enterprise
            Reply-to: [email protected]
            Subject: [DB Info] for $NEW_DOMAIN_NAME on enterprise.exsite.co
            Content-Type: text/html

            HEADERS
        cat -
        cat /usr/bin/games/dbLog.txt
    } | /usr/sbin/sendmail -t && echo "STATUS: Mail sent!"
}

注意这里我使用了 heredoc 来<<-允许使用前导制表符来缩进文档。bash 严格限制使用前导制表符,而不是空格,因此要小心。


您是否知道printf不会在输出的字符串中添加换行符?所有消息都将被压缩到一行上。

相关内容