Terhubung ke MySQL melalui baris perintah tanpa perlu kata sandi root

11

Saya sedang membangun skrip Bash untuk beberapa tugas. Salah satu tugas tersebut adalah membuat DB MySQL dari skrip bash yang sama. Apa yang saya lakukan saat ini adalah membuat dua vars: satu untuk nama pengguna toko dan yang lainnya untuk kata sandi toko. Ini adalah bagian yang relevan dari skrip saya:

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

Tetapi selalu mendapatkan kesalahan yang mengatakan akses ditolak untuk root pengguna dengan NO PASSWORD, apa yang saya lakukan salah? Saya perlu melakukan hal yang sama untuk PostgreSQL.

ReynierPM
sumber
Lakukan debugging (-: Coba echo "$MYSQL_PASS"sebelum Anda meneruskannya ke mysqlbaris. Apakah ada kata sandi yang benar?
KM.
Bisakah Anda masuk seperti biasa tanpa skrip?
qweet
4
-h tidak ada. Ini juga bukan ide yang baik untuk meletakkan kata sandi pada command-line, karena mereka akan terlihat untuk semua orang yang menelepon ps wwaux.
Nils

Jawaban:

23

Baik untuk MySQL dan PostgreSQL Anda dapat menentukan pengguna dan kata sandi Anda dalam file konfigurasi lokal. .my.cnf untuk MySQL dan .pgpass untuk PostgreSQL. File-file ini harus di direktori home Anda (mis. ~ / .My.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Anda dapat memiliki entri wildcard di sini, menggantikan bidang apa pun dengan *******.

PS: JANGAN PERNAH MENYESUAIKAN PASSWORD DI ATAS PERINTAH! Ini dapat terlihat sempurna dengan ps jika sistem Anda tidak dikonfigurasikan untuk tidak menunjukkan proses yang menjadi milik pengguna lain.

@ Thinice: Jika Anda ingin membuat file-file itu benar-benar aman, Anda harus melakukannya:

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

Dengan cara ini file akan dibuat dengan izin yang aman sejak awal dan tidak ada penyadap yang akan memiliki kesempatan untuk mencuri kata sandi Anda.

PostgreSQL akan menolak untuk menggunakan file dengan izin lebih tinggi pada 0600.

kworr
sumber
1
Untuk mysql klien mysql Anda dapat menunjuk pada file konfigurasi tertentu dengan --defaults-extra-file=filename. Ini mungkin berguna jika Anda ingin menempatkannya di tempat yang tidak standar, atau hanya membuat file sementara. Diduga mereka adalah opsi yang mirip dengan PostgreSQL, tapi saya tidak terbiasa dengan itu.
Zoredache
1
Dan untuk cinta celana pendek 0600
Gilmore
@kworr Saya akan mencoba, tetapi MySQL saya tidak mulai mengubah parameter ini di /etc/my.cnf :( tidak tahu penyebabnya. Saya akan coba lagi nanti
ReynierPM
Itu bukan /etc/my.cnf. Memperbarui jawaban.
kworr
@ kworr Saya mencoba solusi Anda tetapi tidak berhasil sama sekali. DB dibuat dengan kosong dan tidak muncul di phpMyAdmin atau alat GUI lainnya. Saya mengatur direktori data di /etc/my.cnf ke datadir = / data / var / lib / mysql dan mengatur izin ke 0755 di / data / var / lib / mysql dan juga pemilik ke mysql: mysql, mengapa database kosong ? dimana masalahnya?
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 

Ini akan melakukan triknya Terima kasih

Abhijeet Kasurde
sumber
2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Bagaimana cara menjalankan baris perintah dengan kata sandi yang aman ?? gunakan editor konfigurasi !!!

Pada mysql 5.6.6 Anda dapat menyimpan kata sandi dalam file config dan kemudian menjalankan perintah cli seperti ini ....

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

--login-path menggantikan variabel ... host, pengguna DAN kata sandi. sangat bagus!

Artistan
sumber
1
Terima kasih telah berbagi! Hanya ada satu gotcha dari pendekatan ini. Parameter --login-path harus menjadi parameter pertama dari panggilan atau Anda akan mendapatkan pesan "variabel tidak dikenal 'login-path = local'".
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

pastikan bagaimana Anda menulis pass Anda dan itu tidak luput

--defaults-extra-file = adalah hal yang baik (tm) (c)

GioMac
sumber
1

Jangan menaruh tanda kutip di sekitar kata sandi karena jika Anda melakukannya tanda kutip dianggap sebagai bagian dari kata sandi.

John Gardeniers
sumber
0

Pertanyaan serupa ada di StackOverflow.

Untuk meringkas jawaban saya dari sana.

Kamu bisa export MYSQL_PWD=yourverysecretpassword.

Kelebihan metode ini dalam menggunakan file konfigurasi adalah Anda tidak perlu file konfigurasi terpisah untuk tetap sinkron dengan skrip Anda. Anda hanya memiliki skrip untuk dipelihara.

Tidak ada kerugian untuk metode ini.

Kata sandi tidak terlihat oleh pengguna lain di sistem (itu akan terlihat jika ada di baris perintah). Variabel lingkungan hanya terlihat oleh pengguna yang menjalankan perintah mysql, dan root.

Kata sandi juga akan terlihat oleh siapa saja yang dapat membaca skrip itu sendiri, jadi pastikan skrip itu sendiri terlindungi. Ini sama sekali tidak berbeda dengan melindungi file konfigurasi. Anda masih dapat sumber kata sandi dari file terpisah jika Anda ingin agar skrip dapat dibaca export MYSQL_PWD=$(cat /root/mysql_password)untuk umum ( misalnya). Masih lebih mudah untuk mengekspor variabel daripada membangun file konfigurasi.

Misalnya,

$ 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
sumber