这个想法是通过 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
不会在输出的字符串中添加换行符?所有消息都将被压缩到一行上。