@perrfect

Как скрыть пароль mysql в bash-скрипте?

Добрый день.
Как можно скрыть пароль в bash-скрипте для команды mysqldump?
mysqldump -u root -p111111 --all-databases > db_back.sql
  • Вопрос задан
  • 1475 просмотров
Пригласить эксперта
Ответы на вопрос 4
@AVKor
Создать ~/.my.cnf с содержимым
........
[mysqldump]
all-databases
result_file=db_back.sql 
user=root
password=111111
........
Ответ написан
Комментировать
Так будет лучше чем держать чем все базы в одном файле
Пример дампа всех баз в отдельные файлы

#!/bin/sh
#скрипт бэкапа баз данных
###########################
#Создаем папку для архивов.  -p не ругается когда папка уже есь test проверяет есть ли папка  для чистых логов
test ! -d /var/backup/mysql/`date +%Y` && { mkdir -p /var/backup/mysql/`date +%Y` ; }
test ! -d /var/backup/mysql/last && { mkdir -p /var/backup/mysql/last ; }

#прячем от умных, и так не зайдут но всеже.
chmod 600 /var/backup/mysql
chmod 600 /var/backup/mysql/last

# делаем сам дапм файлов sql, свежинькие файлы лежат всегда в ней, очень удобно не нужно заходить в архивы и искать там вчерашние базы, и логируется.
for i in `mysql -uroot -p11111111 -e'show databases;' | grep -v information_schema | grep -v Database`; do mysqldump -uroot -pp11111111 $i > /var/backup/mysql/last/$i.sql;done >> /dev/null 2>> /var/log/sqlbackup.log
# Архивируем дамп, ну и логируем разумеется
cd /var/backup/mysql/
tar -czvf /var/backup/mysql/`date +%Y`/sqldump-`date +%Y-%m-%u`.tar.gz ./last >> /dev/null > /var/log/sqlbackup.log
#(echo "Subject: Бэкап mysql  klondike-server завершен"; cat /var/log/sqlbackup.log;) | /usr/sbin/sendmail  viktor@7877796.ru
##################  Конец скрипта

#  БЭКАП /etca
test ! -d /var/backup/etc/ && { mkdir -p /var/backup/etc/ ; }
DATE=`date +%F`;
BACKUPPATH="/var/backup/etc";
find $BACKUPPATH/ -mtime +60 | xargs rm -f; #удаляет предыдущие бэкапы старше 60 дней.
tar -czvf "$BACKUPPATH/etc.$DATE.tar.gz" /etc/ > /dev/null 2> /dev/null;


ну или вариант .
#!/bin/sh
# Пример пути до сайта /var/www/site.ru/web/
SITEDIR="/var/www"                                  # Папка до названия доменаов
WEB="web"                                           # Папка после названия доменов (если есть)
DBCONN="bitrix/php_interface/dbconn.php"            # Откуда читать настройки mysql
FTPUSER="111111111"                                   # Логин FTP сервера
FTPPASS="111111111111111"                        # Пароль FTP
FTPHOST="u113948.your-storagebox.de"                # сервер FTP
FTPDIR="/11111.ru/site/"                             # папка на FTP
TMPDIR="/var/backup/site"                           # Где будут храниться временные файлы
DATE=`date +"%Y-%m-%d"`                             # Формат даты в имени файла
DATEYM=`date +%Y`/`date +%m`                        # Второй форматы даты
LIST=${1:-`ls -L $SITEDIR | grep -E ".*\.\w{1,5}" | grep -v "restore.php" | grep -v "klondike.php"`} # Название сайта, тут выбор или аргумент или, регулярка  можно убрать только -L ;)

test ! -d $TMPDIR/$DATEYM && mkdir -p $TMPDIR/$DATEYM # создаем  структ уру каталогов если их нет

for ELEMENT in $LIST
    do
                if [ ! -f /$SITEDIR/$ELEMENT/$WEB/$DBCONN ];
                        then
                            echo " Файл $SITEDIR/$ELEMENT/$WEB/$DBCONN не найден, сайт будет без БД!"
                        else
                                DBLOGIN=$(grep "^\$DBLogin =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
                                DBPASS=$(grep "^\$DBPassword =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
                                DBNAME=$(grep "^\$DBName =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
                                mysqldump -u$DBLOGIN -p$DBPASS $DBNAME > $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql && echo "Дамп БД $DBNAME будет сохранен в корне сайта"  ||  echo "Ошибка дампа базы данных " $DBNAME
                                sed -i "/\/*40101 SET/d" $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql
                                sed -i "/\/*40103 SET/d" $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql
                                sed -i "/\!40111 SET/d" $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql
                                sed -i "/\!40014 SET/d" $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql
                                sed -i "/\!40000 ALTER/d" $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql
                                #echo "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';" > $SITEDIR/$ELEMENT/$WEB/bitrix/backup/$DBNAME\-$DATE\_after_connect.sql

                fi

    echo "Архивируем сайт $ELEMENT"
        tar -cvpzf $TMPDIR/$DATEYM/$ELEMENT-$DATE.tar.gz --directory $SITEDIR/$ELEMENT/$WEB --ignore-failed-read --exclude='./bitrix/tmp' --exclude='./bitrix/updates' --exclude='./bitrix/backup/*\.gz*' --exclude='./bitrix/backup/*\.tar*' --exclude='./bitrix/cache' --exclude='./bitrix/managed_cache' --exclude='./bitrix/stack_cache' --exclude='./upload/resize_cache' --exclude='./stats' . >> /dev/nool 2> /var/log/backup_error.log
        rm -f $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql # поскльку ложим на реальный сайт, ибо нормально добавить в архив не получитяс.
        #rm -f $SITEDIR/$ELEMENT/$WEB/bitrix/backup/$DBNAME\-$DATE\_after_connect.sql

        echo "Сохраняем $ELEMENT на FTP"
        wput  --basename=$TMPDIR --limit-rate=60000K --timestamping  --tries=2 $TMPDIR/$DATEYM/$ELEMENT-$DATE.tar.gz ftp://$FTPUSER:$FTPPASS@$FTPHOST$FTPDIR
        rm -f $TMPDIR/$DATEYM/$ELEMENT-$DATE.tar.gz

echo -en "\n\033[37;1;41m Ссылочка:\033[0m \e[1;4;36mwget ftp://u113948-sub1:11111111111@$FTPHOST/$DATEYM/$ELEMENT-$DATE.tar.gz\e[0m\n\n" #ks05
  done
rm -r $TMPDIR

Данный вариант уже поддерживает аргумент в виде сайта котормоу нужно сделать дампbxbump site.ru, так же он демпит сам сайт со спецификой движка ( тут битрикс) берет данные прям с конфига, заливает на внешний фтп
Если аргумента нет то будет дамп всех сайтов и всех бд к ним
ну и дает ссылку в режиме RO уже для чтения с этого сервера.
p.s требует доустановку wput поскольку можно ограничить скорость аплоада
Ответ написан
@BorisKorobkov Куратор тега MySQL
Web developer
Смотря для чего?

Если на сервер имеет доступ несколько юзеров, от которых надо скрыть root-пароль, чтобы в .bash_history не увидели, то запускайте вручную
1. Вводите пароль с клавиатуры
mysqldump -u root -p --all-databases > db_back.sql
2. Добавьте пробел в начало
mysqldump -u root -p111111 --all-databases > db_back.sql


Если на сервер имеет доступ несколько юзеров, от которых надо скрыть root-пароль из cron, то правильно настройте права доступа.

Если другие юзеры доступ на сервер не имеют, а надо убрать пароль из скрипта в репозитории, то можно его вынести в отдельный файл (вне репозитория) или в переменные окружения. Но это костыли - правильнее скрипт дампа вообще не хранить в репозитории или хотя бы хранить только его шаблон.

Если на сервер имеет доступ несколько юзеров, имеющих доступ к вашей папке, то никак. Скрипт как-то должен получить пароль. Значит, другой юзер точно так же получит ваш пароль.
Ответ написан
@vitaly_il1
DevOps Consulting
MySQL умеет хранить пароли зашифрованными в конфигурационном файле.
Для использования

mysql --login-path=profile

Для конфигурации

mysql_config_editor set --login-path=profile --host=localhost \
--port=3306 --socket=/path/to/socket --user=root --password

Подробнее - https://www.speedemy.com/create-mysql-login-path/ или MySQL доки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы