Как использовать переменные в bash для вывода в файл и в тело письма с sendmail

0

Я работал над этим небольшим сценарием, и я почти приступил к его использованию.

Идея состоит в том, чтобы автоматизировать установку WordPress через Plesk.

У меня есть настройка Plesk с cronjob для загрузки файла latest.tar.gz с wordpress.com и извлечения его каждое утро, и теперь я пытаюсь автоматизировать процесс создания базы данных.

У меня есть следующий скрипт 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

Я знаю, что это не самый аккуратный сценарий, но он находится в стадии разработки, и мой первый сценарий bash настолько открыт для меня.

Возникают две проблемы, но я не понимаю, почему;

Переменные CHAR2 и CHAR4, похоже, не воспринимают 2-й и 4-й символы $ DOMAINNAME - они просто выводят пустые данные в passChat.txt

$ NEW_DOMAIN_NAME переходит в newdomain.txt, но затем следующая строка, где я пытаюсь вернуть только домен 2-го уровня, кажется неудачной. Это работало на более ранней стадии, но это не сейчас. Я не изменил эту часть, хотя.

грязевой
источник
Синтаксис для более «продвинутой» замены параметров НЕ включает в себя доллар внутри фигурных скобок ( ref ) -CHAR2=${DOMAINNAME:1:1}
Гленн Джекман
Как $NEW_DOMAIN_NAMEвыглядит? Я не могу понять, что должна делать строка grep | cut | rev | ...
Гленн Джекман,
$ NEW_DOMAIN_NAME должен быть mydomain.com, а CHAR2 = $ {DOMAINNAME: 1: 1} должен получить мне 2-й символ, поэтому в этом случае должен содержать символ «y» из «mydomain.com», а CHAR4 должен содержать 'o'
Грязь
о, а grep | cut | rev должен убрать www. и .com с доменного имени, хотя они сейчас проходят без www. так может в этом проблема?
Грязь

Ответы:

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. Любые переменные не будут заменены.

Вы, кажется, хотите связать heredoc, затем stdin, затем именованный файл, и затем передать все это в sendmail. Вам понадобится немного больше синтаксиса, чтобы сделать это: используйте { grouping }фигурные скобки для объединения информации, затем передайте результат в 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!"
}

Обратите внимание, что здесь я использовал heredoc, <<-чтобы разрешить использование ведущих вкладок для отступа в документе. bash строго относится только к начальным символам, а не к пробелам, так что будьте осторожны с этим.


Знаете ли вы, что printfне добавляет новую строку к выводимой строке? Все ваши сообщения будут объединены в одну строку.

Гленн Джекман
источник
Большое вам спасибо :) Я внесу соответствующие изменения, которые вы предложили, и посмотрю, куда это меня приведет.
Грязь
Это происходит, когда я выполняю функцию sendmail и не могу понять, что означает ошибка? У вас есть пустая строка после завершающего заголовка? Почему он не видит это как 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
Грязь
1
Убедитесь, что перед завершающими заголовками присутствуют только символы табуляции .
Гленн Джекман
1
Я редко использую <<-только для этой потенциальной проблемы. Трудно поддерживать только вкладки. В моей настройке vim для отступов используются пробелы, поэтому для обеспечения вкладок требуются дополнительные усилия.
Гленн Джекман
Теперь единственное, что функция get domains не работает - она ​​просто вернула пустую строку? Я только что переписал свою команду grep | rev | cut | rev, но понял, что она работает только для доменов .com (или любых трехбуквенных tlds), но не для лайков или .ie или .co.uk. :) Еще раз спасибо!
Грязь