Come utilizzare le variabili in bash per l'output in un file e in un corpo di posta con sendmail


0

Ho lavorato su questo piccolo script ed è quasi arrivato il punto in cui posso iniziare a usarlo.

L'idea è di automatizzare le installazioni di WordPress tramite Plesk.

Ho installato Plesk con un cronjob per scaricare il latest.tar.gz da wordpress.com ed estrarlo ogni mattina e ora sto cercando di automatizzare il processo di creazione del database.

Ho il seguente script 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: 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

So che non è la sceneggiatura più piccola, ma è un work in progress e il mio primo script di bash è così semplice con me.

Si verificano due problemi ma non capisco perché;

Le variabili CHAR2 e CHAR4 non sembrano raccogliere il 2 ° e il 4 ° carattere di $ DOMAINNAME - vengono semplicemente visualizzati vuoti in passChat.txt

$ NEW_DOMAIN_NAME passa a newdomain.txt ma poi la riga successiva in cui provo a restituire solo il dominio di secondo livello sembra non riuscire. Funzionava in un momento precedente ma non è ora. Non avevo cambiato quella parte però.


La sintassi per la sostituzione del parametro più "avanzata" NON include il dollaro dentro le parentesi ( arbitro ) - CHAR2=${DOMAINNAME:1:1}
glenn jackman

Cosa fa $NEW_DOMAIN_NAME Assomiglia a? Non riesco davvero a ingannare ciò che quella linea grep | cut | rev | ... dovrebbe fare
glenn jackman

$ NEW_DOMAIN_NAME dovrebbe essere mydomain.com e CHAR2 = $ {DOMAINNAME: 1: 1} dovrebbe ottenere il secondo carattere, quindi in questo caso, dovrebbe contenere il carattere 'y' da 'mydomain.com' e CHAR4 dovrebbe contenere 'O'
Mud

oh e il grep | cut | rev dovrebbe spogliare il www. e il .com dal nome di dominio anche se stanno arrivando ora senza www. quindi forse questo è il problema?
Mud

Risposte:


1

Supponendo che tu voglia ottenere "mydomain", a prescindere dal fatto che ti venga assegnato uno dei seguenti termini: "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

Il modo corretto per verificare i risultati del tuo sendmail la funzione è con molto meno sintassi:

if sendmail
then echo OK
else echo uh oh
fi

if controlla lo stato di uscita di un comando. Nota che [[ è un comando built-in bash (che richiede il suo ultimo argomento) ]] ) - al prompt di bash, digitare help [[ if


Nel tuo sendmail funzione, tu usi cat << 'EOF' - che efficacemente cita solo l'intero here-doc. Qualsiasi variabile lo farà non essere sostituito

Sembra che vogliate concatenare l'heredoc, poi lo stdin, di un file con nome, e poi inviare tutto a sendmail. Avrai bisogno di un po 'più di sintassi per farlo: usa il { grouping } parentesi per concatenare le informazioni, quindi reindirizzare il risultato a 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!"
}

Nota qui ho usato un heredoc con <<- per consentire l'uso delle schede di apertura per il rientro del documento. bash è rigoroso riguardo solo le tabulazioni iniziali, non gli spazi, quindi fai attenzione.


Lo sai? printf non aggiunge una nuova riga alla stringa emessa? Tutti i tuoi messaggi saranno schiacciati insieme su una riga.


Grazie mille :) Farò le opportune modifiche che hai suggerito e vedere dove mi arriva.
Mud

Questo succede quando eseguo la funzione sendmail e non riesco a capire cosa significa l'errore? Hai la riga vuota dopo l'HEADER di chiusura? Perché non lo vede come EOF? newDB.sh: line 66: warning: here-document at line 46 delimited by end-of-file (wanted Intestazioni ') ` newDB.sh: line 67: syntax error: unexpected end of file
Mud

1
Assicurati che ci siano solo caratteri tab prima delle terminazioni.
glenn jackman

Ha funzionato :) Grazie per quello!
Mud

1
Uso raramente <<- solo per questo potenziale problema. È difficile mantenere solo le schede. Il mio setup di vim utilizza gli spazi per il rientro, quindi è un ulteriore sforzo assicurare le schede.
glenn jackman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.