Comment utiliser des variables dans bash pour générer un fichier et un corps de courrier avec sendmail

0

J'ai travaillé sur ce petit script et c'est à un point que je peux commencer à l'utiliser.

L'idée est d'automatiser les installations de WordPress via Plesk.

J'ai installé Plesk avec un fichier cronjob pour télécharger le fichier latest.tar.gz de wordpress.com et l'extraire tous les matins. Maintenant, j'essaie d'automatiser la création de bases de données.

J'ai le script bash suivant:

#!/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: servers@exsite.ie
From: Enterprise
Reply-to: alex@exsite.ie
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

Je sais que ce n'est pas le script le plus sophistiqué, mais que c'est un travail en cours et que mon premier script bash est tellement nu avec moi.

Deux problèmes se posent mais je ne comprends pas pourquoi;

Les variables CHAR2 et CHAR4 ne semblent pas capturer les 2ème et 4ème caractères de $ DOMAINNAME - elles sortent simplement vides dans passChat.txt

$ NEW_DOMAIN_NAME va dans newdomain.txt, mais la ligne suivante où j'essaie de renvoyer uniquement le domaine de 2e niveau semble échouer. Cela fonctionnait plus tôt, mais ce n'est pas maintenant. Je n'avais pas changé cette partie cependant.

Boue
la source
La syntaxe pour plus substitution de paramètres « avancé » ne comprend pas le dollar à l' intérieur des accolades ( ref ) -CHAR2=${DOMAINNAME:1:1}
glenn jackman
A quoi $NEW_DOMAIN_NAMEressemble? Je ne peux pas vraiment dire ce que cette ligne grep | cut | rev | ... est supposée faire
glenn jackman
$ NEW_DOMAIN_NAME est supposé être mydomain.com et CHAR2 = $ {DOMAINNAME: 1: 1} devrait m'obtenir le deuxième caractère. Dans ce cas, le caractère "y" de "mydomain.com" et CHAR4 devraient l'être 'o'
Mud
oh et le grep | cut | rev est supposé dépouiller le www. et le .com du nom de domaine bien qu'ils arrivent sans www. alors c'est peut-être le problème?
Boue

Réponses:

1

En supposant que vous souhaitiez obtenir "mydomain", que vous receviez l'un des éléments suivants: "mydomain.com", "www.mondomaine.com", "mail.secure.mydomain.com", ...

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

get_domain foo.bar.baz.qux
baz

La manière appropriée de vérifier les résultats de votre sendmailfonction est avec beaucoup moins de syntaxe:

if sendmail
then echo OK
else echo uh oh
fi

ifvérifie le statut de sortie d'une commande. Notez qu’il [[s’agit d’une commande intégrée bash (qui requiert le dernier argument ]]): à l’invite bash, tapezhelp [[ if


Dans votre sendmailfonction, vous utilisez cat << 'EOF'- qui cite simplement toute la documentation ici. Aucune variable ne sera substituée.

Vous semblez vouloir contaténer l'hérédoc, puis stdin, puis un fichier nommé, puis dirigez tout cela vers sendmail. Vous aurez besoin d'un peu plus de syntaxe pour le faire: utilisez les { grouping }accolades pour concaténer les informations, puis dirigez le résultat vers sendmail

sendMail() {
    {
        cat <<- HEADERS
            To: servers@exsite.ie
            From: Enterprise
            Reply-to: alex@exsite.ie
            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!"
}

Notez ici que j'ai utilisé un heredoc avec <<-pour permettre l'utilisation d'onglets de tête pour indenter le document. bash est strict et ne concerne que les tabulations, pas d'espaces, alors soyez prudent.


Savez-vous que cela printfn’ajoute pas de nouvelle ligne à la chaîne sortie? Tous vos messages vont être écrasés ensemble sur une seule ligne.

Glenn Jackman
la source
Merci beaucoup :) Je vais apporter les modifications appropriées que vous avez suggérées et voir où cela me mène.
Boue
Cela se produit lorsque je fais votre fonction sendmail et que je n'arrive pas à comprendre ce que signifie l'erreur. Vous avez la ligne blanche après le HEADER final? Pourquoi ne voit-il pas cela comme l'EOF? newDB.sh: line 66: warning: here-document at line 46 delimited by end-of-file (wanted HEADERS ') `newDB.sh: line 67: syntax error: unexpected end of file
Mud
1
Assurez-vous qu'il n'y a que des caractères de tabulation avant les HEADERS de terminaison.
Glenn Jackman
1
J'utilise rarement <<-juste pour ce problème potentiel. Il est difficile de ne garder que des onglets. La configuration de vim utilise des espaces pour l'indentation, donc il faut redoubler d'efforts pour garantir les onglets.
glenn jackman
La seule chose à présent, c’est que la fonction get domains ne semble pas fonctionner - elle renvoie simplement une chaîne vide? Je viens de réécrire ma commande grep | rev | cut | rev pour le moment, mais j’ai réalisé que cela ne fonctionne que pour les domaines .com (ou n’importe quel fichier tld de 3 lettres), mais pas pour les goûts ou les fichiers .ie ou .co.uk. :) Merci encore!
Boue