Como eu uso variáveis no bash para gerar saída para um arquivo e para um corpo de email com o sendmail

0

Eu tenho trabalhado neste pequeno script e é quase em um ponto que eu posso começar a usá-lo.

A ideia é automatizar as instalações do WordPress via Plesk.

Eu tenho a configuração do Plesk com um cronjob para fazer o download do latest.tar.gz do wordpress.com e extraí-lo todas as manhãs e agora estou tentando automatizar o processo de criação do banco de dados.

Eu tenho o seguinte script:

#!/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

Eu sei que não é o roteiro mais arrumado, mas é um trabalho em andamento e meu primeiro roteiro de bash está tão nu comigo.

Dois problemas estão ocorrendo, mas eu não entendo o porquê;

As variáveis CHAR2 e CHAR4 parecem não pegar o segundo e o quarto caractere de $ DOMAINNAME - eles são exibidos como vazios em passChat.txt

$ NEW_DOMAIN_NAME vai para newdomain.txt, mas a próxima linha em que tento retornar apenas o domínio de segundo nível parece falhar. Ele estava trabalhando em um ponto anterior, mas não é agora. Eu não tinha mudado essa parte embora.

    
por Mud 24.04.2014 / 22:29

1 resposta

1

Supondo que você deseja obter "mydomain" se tiver algum destes: "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

A maneira correta de verificar os resultados da sua função sendmail é com muito menos sintaxe:

if sendmail
then echo OK
else echo uh oh
fi

if verifica o status de saída de um comando. Observe que [[ é um comando embutido bash (que requer que seu último argumento seja ]] ) - em um prompt bash, digite help [[ if

Na sua função sendmail , você usa cat << 'EOF' - que efetivamente escolhe aspas inteiras do aqui-doc. Quaisquer variáveis não serão substituídas.

Você parece querer contatenar o heredoc, depois stdin, depois um arquivo nomeado, e depois canalizar tudo isso para o sendmail. Você precisará de um pouco mais de sintaxe para isso: use as chaves { grouping } para concatenar as informações e depois canalize o resultado para o 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!"
}

Note aqui que usei um heredoc com <<- para permitir o uso das guias iniciais para recuar o documento. O bash é estrito sobre apenas os separadores principais, não os espaços, por isso tenha cuidado com isso.

Você está ciente de que printf não acrescenta uma nova linha à string produzida? Todas as suas mensagens serão agrupadas em uma linha.

    
por 24.04.2014 / 23:16