Подключение к MySQL через командную строку без необходимости пароля root

11

Я создаю сценарий 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.

ReynierPM
источник
Выполните некоторую отладку (-: попробуйте, echo "$MYSQL_PASS"прежде чем передать его на mysqlлинию. У него есть правильный пароль?
KM.
Можете войти как обычно без скрипта?
Qweet
4
Х отсутствует. Также не рекомендуется помещать пароли в командную строку, поскольку они будут видны всем, кто звонит ps wwaux.
Нильс

Ответы:

23

Как для MySQL, так и для PostgreSQL вы можете указать своего пользователя и пароль в локальном конфигурационном файле. .my.cnf для MySQL и .pgpass для PostgreSQL. Эти файлы должны быть в вашем домашнем каталоге (т.е. ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Здесь вы можете использовать шаблонную запись, заменяя любое поле на *******.

PS: НИКОГДА НЕ УКАЗЫВАЙТЕ ПАРОЛЬ НА КОМАНДНОЙ ЛИНИИ! Это может быть прекрасно видно с помощью ps, если ваша система не настроена так, чтобы не показывать процессы, принадлежащие другим пользователям.

@thinice: Если вы хотите создать эти файлы действительно безопасно, вы должны сделать:

umask 077
touch .my.new.config
umask 022 # or whatever was your default

Таким образом, файл будет создан с безопасными разрешениями с самого начала, и ни у одного перехватчика не будет возможности взломать ваш пароль.

PostgreSQL все равно откажется использовать файл с разрешениями выше 0600.

kworr
источник
1
Для mysql клиент mysql вы можете указать на конкретный файл конфигурации --defaults-extra-file=filename. Это может быть полезно, если вы хотите поместить его в нестандартное место или просто создать временный файл. Подозреваю, что это аналогичный вариант с PostgreSQL, но я не знаком с этим.
Зоредаче
1
И ради любви к шортам счастливого Гилмора, чмод этого файла0600
тощий
@kworr Я уже попробую это сделать, но мой MySQL не начинает изменять эти параметры в /etc/my.cnf :( не знал причину. Я попробую еще раз позже
ReynierPM
Это не /etc/my.cnf. Обновление ответа.
Kworr
@kworr Я пробую ваше решение, но не работает вообще. БД создается пустой и не отображается в phpMyAdmin или любом другом инструменте с графическим интерфейсом. Я установил каталог данных в /etc/my.cnf на datadir = / data / var / lib / mysql и установил права доступа на 0755 в / data / var / lib / mysql, а также владельца на mysql: mysql, почему база данных пуста ? в чем проблема?
ReynierPM
2
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 

Это сделает свое дело Спасибо

Абхиджит Касурде
источник
2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Как мне выполнить командную строку с безопасным паролем ?? используйте редактор настроек !!!

Начиная с mysql 5.6.6, вы можете сохранить пароль в конфигурационном файле, а затем выполнить команды cli следующим образом ...

mysql --login-path=storedPasswordKey ....

--login-path заменяет переменные ... хост, пользователь и пароль. отлично верно!

Artistan
источник
1
Спасибо, что поделился! Есть только один недостаток от этого подхода. Параметр --login-path должен быть первым параметром вызова, иначе вы получите сообщение «неизвестная переменная 'login-path = local'".
Андре Аугусто,
1
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 = это хорошая вещь (тм) (с)

GioMac
источник
1

Не ставьте кавычки вокруг пароля, потому что если вы это сделаете, кавычки считаются частью пароля.

Джон Гарденье
источник
0

Подобный вопрос существует на 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 */;
chutz
источник