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


11

Я будую сценарій Bash для деяких завдань. Одне з цих завдань - створити MySQL DB з того самого сценарію 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 заборонено користуватися NO PASSWORD. Мені потрібно зробити те ж саме для PostgreSQL.


Зробіть налагодження (-: Спробуйте, echo "$MYSQL_PASS"перш ніж передати його на mysqlрядок. Чи має він правильний пароль?
КМ.

Чи можете ви увійти як звичайно без сценарію?
qweet

4
-h відсутній. Також непогано ставити паролі в командному рядку, оскільки вони будуть видимі для всіх, хто дзвонить 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.


1
Для mysql клієнта mysql можна вказати на певний конфігураційний файл --defaults-extra-file=filename. Це може бути корисно, якщо ви хочете розмістити його десь нестандартно або просто створити тимчасовий файл. Підозрюєте, що це схожий варіант з PostgreSQL, але я з цим не знайомий.
Зоредаче

1
А за любов до щасливих шорт Гілмора chmod, що файл0600
стрімкі

@kworr Я спробую це, але мій MySQL не починає змінювати ці параметри на /etc/my.cnf :( не знав причину. Спробую ще раз пізніше
ReynierPM

Це не /etc/my.cnf. Оновлення відповіді.
kworr

@kworr Я спробую ваше рішення, але не працює взагалі. БД створюється порожнім і не відображається в phpMyAdmin або будь-якому іншому інструменті GUI. Я встановлюю каталог даних у /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 замінює змінні ... хост, користувач І пароль. відмінна справа!



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 = хороша річ (tm) (c)


1

Не ставте лапки навколо пароля, тому що, якщо ви робите, котирування вважаються частиною пароля.


1

Аналогічне запитання існує і в 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 */;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.