Я создаю сценарий Bash для некоторых задач. Одна из этих задач - создать базу данных MySQL из того же сценария bash. Сейчас я создаю две вары: одну для имени пользователя магазина, а другую - для пароля магазина. Это соответствующая часть моего сценария:
MYSQL_USER=root
MYSQL_PASS=mypass_goes_here
touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password="$MYSQL_PASS" < /tmp/script.sql
rm -rf /tmp/script.sql
Но всегда появляется сообщение об ошибке: доступ запрещен для пользователя root без ПАРОЛЯ, что я делаю не так? Мне нужно сделать то же самое для PostgreSQL.
И для MySQL, и для PostgreSQL вы можете указать своего пользователя и пароль в локальном файле конфигурации. .my.cnf для MySQL и .pgpass для PostgreSQL. Эти файлы должны находиться в вашем домашнем каталоге (т.е. ~ / .my.cnf).
.my.cnf:
[mysql]
user=user
password=password
.pgpass:
host:port:database:user:password
Здесь вы можете использовать подстановочный знак, заменяя любое поле на *******.
PS: НИКОГДА НЕ УКАЗЫВАЙТЕ ПАРОЛЬ В КОМАНДНОЙ СТРОКЕ! Это хорошо видно с пс если ваша система не настроена так, чтобы не отображать процессы, принадлежащие другим пользователям.
@thinice: Если вы хотите, чтобы эти файлы были действительно безопасными, вам следует сделать:
umask 077
touch .my.new.config
umask 022 # or whatever was your default
Таким образом, файл будет создаваться с безопасными разрешениями с самого начала, и ни один перехватчик не сможет украсть ваш пароль.
PostgreSQL в любом случае откажется использовать файл с разрешениями выше 0600.
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password
Как мне выполнить командную строку с безопасным паролем? используйте редактор конфига !!!
Начиная с mysql 5.6.6, вы можете сохранить пароль в файле конфигурации, а затем выполнять такие команды cli ....
mysql --login-path=storedPasswordKey ....
--login-path заменяет переменные ... хост, пользователь И пароль. отличное право!
MYSQL_USER="root"
MYSQL_PASSWORD="PASSWORD"
DBNAME="DB_NAME"
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE $DBNAME;" 2> /tmp/error1
STATUS=$?
if [ $STATUS -eq 0 ];
then
echo -e "Database '$DBNAME' is created"
elif (grep -i "^ERROR 1007" /tmp/error1 > /dev/null);
then
echo -e "Database '$DBNAME' already exists"
else
echo -e "Failed to create database '$DBNAME'"
fi
rm -r /tmp/error1
Это поможет, спасибо
Не заключайте пароль в кавычки, потому что в этом случае кавычки считаются частью пароля.
MYSQL_USER="root"
MYSQL_PASS="mypass_goes_here"
touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password=$MYSQL_PASS < /tmp/script.sql
rm -rf /tmp/script.sql
будьте уверены, как вы пишете свой пропуск, и он не ускользнет
--defaults-extra-file = это хорошо (tm) (c)
Аналогичный вопрос существует на StackOverflow.
Подвести итоги мой ответ оттуда.
Ты можешь export MYSQL_PWD=yourverysecretpassword
.
Преимущество этого метода перед использованием файла конфигурации заключается в том, что вам не нужен отдельный файл конфигурации для синхронизации с вашим скриптом. Вам нужно поддерживать только сценарий.
Там есть нет недостатка к этому методу.
Пароль не видимый для других пользователей системы (он был бы видим, если бы он был в командной строке). Переменные среды видны только пользователю, выполняющему команду mysql, и пользователю root.
Пароль также будет виден всем, кто может прочитать сам скрипт, поэтому убедитесь, что сам скрипт защищен. Это ничем не отличается от защиты файла конфигурации. Вы по-прежнему можете получить пароль из отдельного файла, если хотите, чтобы сценарий был общедоступным (export MYSQL_PWD=$(cat /root/mysql_password)
например). По-прежнему проще экспортировать переменную, чем создавать файл конфигурации.
Например.,
$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ mysqldump -u root mysql | head
-- MySQL dump 10.13 Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost Database: mysql
-- ------------------------------------------------------
-- Server version 5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;