Połącz się z wierszem poleceń MySQL koryta bez potrzeby posiadania hasła roota

11

Buduję skrypt Bash dla niektórych zadań. Jednym z tych zadań jest utworzenie bazy danych MySQL z tego samego skryptu bash. W tej chwili tworzę dwie zmienne: jedną dla nazwy użytkownika sklepu i drugą dla hasła sklepu. To jest odpowiednia część mojego skryptu:

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

Ale zawsze pojawia się błąd informujący o odmowie dostępu dla użytkownika root BEZ HASŁA, co robię źle? Muszę zrobić to samo dla PostgreSQL.

ReynierPM
źródło
Wykonaj debugowanie (-: Spróbuj echo "$MYSQL_PASS"przed przekazaniem go do mysqlwiersza. Czy ma poprawne hasło?
KM.
Czy możesz zalogować się jak zwykle bez skryptu?
qweet
4
-h brakuje. Nie jest także dobrym pomysłem umieszczanie haseł w linii poleceń, ponieważ będą one widoczne dla wszystkich dzwoniących ps wwaux.
Nils

Odpowiedzi:

23

Zarówno w przypadku MySQL, jak i PostgreSQL możesz określić użytkownika i hasło w lokalnym pliku konfiguracyjnym. .my.cnf dla MySQL i .pgpass dla PostgreSQL. Te pliki powinny znajdować się w katalogu domowym (tj. ~ / .My.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Możesz tutaj wpisać symbol wieloznaczny, zastępując dowolne pole *******.

PS: NIGDY NIE OKREŚLAJ HASŁA NA LINII POLECEŃ! Może to być doskonale widoczne w ps, jeśli twój system nie jest skonfigurowany tak, aby nie pokazywał procesów należących do innych użytkowników.

@ Thinice: Jeśli chcesz stworzyć te pliki naprawdę bezpieczne, powinieneś:

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

W ten sposób plik byłby tworzony z bezpiecznymi uprawnieniami od samego początku i żaden podsłuchujący nie miałby szansy wyłudzić twoje hasło.

I tak PostgreSQL odmówi użycia pliku z uprawnieniami wyższymi niż 0600.

kworr
źródło
1
W przypadku mysql klienta mysql możesz wskazać konkretny plik konfiguracyjny za pomocą --defaults-extra-file=filename. Może to być przydatne, jeśli chcesz umieścić go w niestandardowym miejscu lub po prostu utworzyć plik tymczasowy. Podejrzewa, że ​​jest podobną opcją w PostgreSQL, ale nie jestem z tym zaznajomiony.
Zoredache,
1
I z miłości do szczęśliwych spodenek Gilmore chmod ten plik0600
cienki
@kworr Spróbuję tego spróbować, ale mój MySQL nie zaczyna zmieniać tych parametrów na /etc/my.cnf :( nie znałem przyczyny. Spróbuję ponownie później
ReynierPM
To nie jest plik /etc/my.cnf. Aktualizuję odpowiedź.
kworr
@kworr Wypróbowuję twoje rozwiązanie, ale w ogóle nie działa. Baza danych jest tworzona przez pustą i nie pojawia się w phpMyAdmin ani żadnym innym narzędziu GUI. Ustawiam katalog danych w /etc/my.cnf na datadir = / data / var / lib / mysql i ustawiam uprawnienia na 0755 w / data / var / lib / mysql, a także właściciela na mysql: mysql, dlaczego baza danych jest pusta ? gdzie jest problem?
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 

To załatwi sprawę Dzięki

Abhijeet Kasurde
źródło
2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Jak wykonać wiersz polecenia z bezpiecznym hasłem? użyj edytora konfiguracji !!!

Począwszy od mysql 5.6.6 możesz przechowywać hasło w pliku konfiguracyjnym, a następnie wykonywać takie polecenia cli ...

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

--login-path zastępuje zmienne ... host, użytkownik ORAZ hasło. doskonale prawda!

Artistan
źródło
1
Dzięki za udostępnienie! Z tego podejścia jest tylko jeden problem. Parametr --login-path musi być pierwszym parametrem wywołania, w przeciwnym razie pojawi się komunikat „ścieżka logowania nieznana = lokalna =”.
André Augusto
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

upewnij się, jak piszesz swoją przepustkę, a ona nie ucieknie

--defaults-extra-file = jest dobrą rzeczą (tm) (c)

GioMac
źródło
1

Nie umieszczaj cudzysłowów wokół hasła, ponieważ jeśli to zrobisz, są one uważane za część hasła.

John Gardeniers
źródło
1

Podobne pytanie istnieje na StackOverflow.

Podsumowując moją odpowiedź stamtąd.

Można export MYSQL_PWD=yourverysecretpassword.

Zaletą tej metody w porównaniu z użyciem pliku konfiguracyjnego jest to, że nie potrzebujesz osobnego pliku konfiguracyjnego do synchronizacji ze skryptem. Masz tylko skrypt do utrzymania.

Nie ma wady tej metody.

Hasło nie jest widoczne dla innych użytkowników w systemie (byłoby widoczne, gdyby znajdowało się w wierszu poleceń). Zmienne środowiskowe są widoczne tylko dla użytkownika uruchamiającego komendę mysql i root.

Hasło będzie również widoczne dla każdego, kto może odczytać sam skrypt, więc upewnij się, że sam skrypt jest chroniony. Nie różni się to niczym od ochrony pliku konfiguracyjnego. Możesz nadal podać hasło z osobnego pliku, jeśli chcesz, aby skrypt był publicznie czytelny ( export MYSQL_PWD=$(cat /root/mysql_password)na przykład). Nadal łatwiej jest wyeksportować zmienną niż zbudować plik konfiguracyjny.

Na przykład,

$ 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
źródło