Kök şifresine gerek olmadan MySQL çukur komut satırına bağlanın


11

Bazı görevler için bir Bash betiği oluşturuyorum. Bu görevlerden biri, aynı bash betiğinden bir MySQL DB oluşturmaktır. Şu anda yaptığım iki varyasyon oluşturmak: biri mağaza kullanıcı adı ve diğeri mağaza şifresi için. Bu benim senaryomun ilgili kısmı:

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

Ancak NO PASSWORD ile kullanıcı kökü için erişim reddedildiğini söyleyen bir hata alıyorum, ne yapıyorum? PostgreSQL için de aynısını yapmam gerekiyor.


Bazı hata ayıklama yap (-: Satıra echo "$MYSQL_PASS"geçmeden önce dene mysql. Doğru şifreye sahip mi?
KM.

Senaryo olmadan her zamanki gibi giriş yapabilir misin?
qweet

4
-h eksik. Şifreleri bir komut satırına koymak da iyi bir fikir değildir, çünkü arayan herkes için görünür olacaklardır ps wwaux.
Nils

Yanıtlar:


23

Hem MySQL hem de PostgreSQL için kullanıcı ve parolanızı yerel yapılandırma dosyasında belirleyebilirsiniz. MySQL için .my.cnf ve PostgreSQL için .pgpass. Bu dosyalar ana dizininizde olmalıdır (yani ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

******* yerine herhangi bir alanın yerine joker karakter girebilirsiniz.

PS: KOMUT HATTI ÜZERİNE ŞİFRE BELİRTİNİZ! Sisteminiz diğer kullanıcılara ait işlemleri göstermeyecek şekilde yapılandırılmamışsa, bu ps ile mükemmel şekilde görülebilir .

@thinice: Bu dosyaları gerçekten güvenli oluşturmak istiyorsanız yapmanız gerekenler:

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

Bu şekilde dosya başlangıçtan itibaren güvenli izinlerle oluşturulacak ve hiçbir dinleyici, şifrenizi sülük şansına sahip olmayacaktır.

PostgreSQL, dosyayı zaten 0600'den daha yüksek izinlerle kullanmayı reddedecektir.


1
Mysql için mysql istemcisi ile belirli bir yapılandırma dosyasına işaret edebilirsiniz --defaults-extra-file=filename. Standart olmayan bir yere yerleştirmek veya sadece geçici bir dosya oluşturmak istiyorsanız bu yararlı olabilir. Onların PostgreSQL ile benzer bir seçenek olduğundan şüpheleniyorum, ama buna aşina değilim.
Zoredache

1
Ve mutlu gilmore şortu aşkı için bu dosyayı chmod0600
20'de incele

@kworr Bunu denemek istiyorum ama MySQL /etc/my.cnf :( bu parametreleri değiştirmeye başlamıyor nedenini bilmiyordum. Daha sonra tekrar deneyeceğim
ReynierPM

/Etc/my.cnf değil. Yanıt güncelleniyor.
kworr

@kworr Çözümünüzü deniyorum ama hiç çalışmıyor. DB boş tarafından oluşturulur ve phpMyAdmin veya başka bir GUI aracında görünmez. /Etc/my.cnf içindeki veri dizinini datadir = / data / var / lib / mysql olarak ayarladım ve izinleri / data / var / lib / mysql'de 0755 ve ayrıca sahibinin mysql: mysql olarak ayarladım, veritabanı neden boş ? sorun nerede?
ReynierPM

3
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Nasıl güvenli bir şifre ile bir komut satırı yürütmek ?? yapılandırma düzenleyicisini kullanın !!!

Mysql 5.6.6 itibariyle parolayı bir yapılandırma dosyasında saklayabilir ve bunun gibi cli komutlarını yürütebilirsiniz.

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

--login-path değişkenleri değiştirir ... host, user AND password. mükemmel doğru!



1
Paylaşım için teşekkürler! Bu yaklaşımdan sadece bir tane var. --Login-path parametresi çağrının ilk parametresi olmalı, yoksa "bilinmeyen değişken 'login-path = local'" iletisini alacaksınız.
André Augusto

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 

Bu hile yapacak Teşekkürler


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

pasınızı nasıl yazdığınızdan emin olun ve kaçmaz

--defaults-extra-file = iyi bir şeydir (tm) (c)


1

Parolanın içine tırnak koymayın, çünkü yaparsanız tırnak parolanın bir parçası olarak kabul edilir.


1

Benzer soru StackOverflow üzerinde de var.

Cevabımı oradan özetlemek gerekirse .

Yapabilirsin export MYSQL_PWD=yourverysecretpassword .

Bu yöntemin bir yapılandırma dosyası kullanmanın tersi, komut dosyanızla senkronize olmak için ayrı bir yapılandırma dosyasına ihtiyacınız olmamasıdır. Sadece senaryonuz var.

Orada hiçbir olumsuz bu yönteme.

Şifredir değil sistemde diğer kullanıcılar tarafından görülebilir (bu komut satırında ise görünür olacaktır). Ortam değişkenleri yalnızca mysql komutunu ve kökü çalıştıran kullanıcı tarafından görülebilir.

Parola ayrıca komut dosyasının kendisini okuyabilen herkes tarafından da görülebilir, bu nedenle komut dosyasının kendisinin korunduğundan emin olun. Bu hiçbir şekilde bir yapılandırma dosyasını korumaktan farklı değildir. Komut dosyasının herkes tarafından okunmasını istiyorsanız, şifreyi yine de ayrı bir dosyadan alabilirsiniz export MYSQL_PWD=$(cat /root/mysql_password). Bir değişkeni dışa aktarmak, bir yapılandırma dosyası oluşturmaktan daha kolaydır.

Örneğin,

$ 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 */;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.