เชื่อมต่อกับบรรทัดรับคำสั่ง MySQL โดยไม่ต้องใช้รหัสผ่านรูต


11

ฉันกำลังสร้างสคริปต์ Bash สำหรับงานบางอย่าง หนึ่งในภารกิจเหล่านั้นคือการสร้างฐานข้อมูล MySQL จากภายในสคริปต์ทุบตีเดียวกัน สิ่งที่ฉันทำตอนนี้คือการสร้างสอง vars: หนึ่งสำหรับชื่อผู้ใช้ร้านค้าและอื่น ๆ สำหรับรหัสผ่านร้านค้า นี่คือส่วนที่เกี่ยวข้องของสคริปต์ของฉัน:

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

แต่มักจะได้รับข้อผิดพลาดว่าการเข้าถึงถูกปฏิเสธสำหรับผู้ใช้รูทด้วยรหัสผ่านไม่สิ่งที่ฉันทำผิด? ฉันต้องทำเช่นเดียวกันสำหรับ PostgreSQL


ทำการแก้ไขข้อบกพร่องบางอย่าง (-: ลองecho "$MYSQL_PASS"ก่อนส่งผ่านไปยังmysqlบรรทัดมีรหัสผ่านที่ถูกต้องหรือไม่
KM

คุณสามารถเข้าสู่ระบบตามปกติโดยไม่มีสคริปต์ได้หรือไม่?
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 แต่ฉันไม่คุ้นเคยกับสิ่งนั้น
Zoredache

1
และสำหรับความรักในกางเกงขาสั้นของ0600
กิลมอร์ที่

@kworr ฉันจะลองดู แต่ MySQL ของฉันไม่เริ่มเปลี่ยนพารามิเตอร์นี้ที่ /etc/my.cnf :( ไม่รู้สาเหตุฉันจะลองอีกครั้งในภายหลัง
ReynierPM

ไม่ใช่ /etc/my.cnf กำลังอัปเดตคำตอบ
kworr

@kworr ฉันลองวิธีการแก้ปัญหาของคุณ แต่ไม่ได้ทำงานเลย DB สร้างขึ้นโดยไม่มีข้อมูลและจะไม่ปรากฏใน 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
ขอบคุณสำหรับการแบ่งปัน! มี gotcha เพียงวิธีเดียวจากวิธีนี้ พารามิเตอร์ --login-path ต้องเป็นพารามิเตอร์แรกของการโทรมิฉะนั้นคุณจะได้รับข้อความ "ตัวแปรที่ไม่รู้จัก '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

ต้องแน่ใจว่าคุณเขียนรหัสผ่านอย่างไรและมันจะไม่หนี

--defaults-extra-file = เป็นสิ่งที่ดี (tm) (c)


1

อย่าใส่เครื่องหมายคำพูดล้อมรอบรหัสผ่านเพราะถ้าคุณทำเครื่องหมายคำพูดนั้นถือว่าเป็นส่วนหนึ่งของรหัสผ่าน


1

มีคำถามที่คล้ายกันใน StackOverflow

เพื่อสรุปคำตอบของฉันจากที่นั่น

export MYSQL_PWD=yourverysecretpasswordคุณสามารถ

ข้อดีของวิธีนี้มากกว่าการใช้ไฟล์กำหนดค่าคือคุณไม่จำเป็นต้องใช้ไฟล์กำหนดค่าแยกต่างหากเพื่อซิงค์กับสคริปต์ของคุณ คุณมีสคริปต์ที่จะรักษาเท่านั้น

มีข้อเสียไม่ให้วิธีนี้

รหัสผ่านจะไม่ปรากฏแก่ผู้ใช้รายอื่นในระบบ (จะปรากฏให้เห็นหากอยู่ในบรรทัดคำสั่ง) ตัวแปรสภาพแวดล้อมจะปรากฏต่อผู้ใช้ที่ใช้คำสั่ง mysql และรูทเท่านั้น

รหัสผ่านจะปรากฏแก่ทุกคนที่สามารถอ่านสคริปต์ได้ด้วยตนเองดังนั้นโปรดตรวจสอบให้แน่ใจว่าได้ป้องกันสคริปต์ด้วยตนเอง สิ่งนี้ไม่แตกต่างไปจากการปกป้องไฟล์กำหนดค่า คุณยังสามารถระบุรหัสผ่านจากไฟล์แยกต่างหากหากคุณต้องการให้สคริปต์อ่านได้แบบสาธารณะ ( 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 */;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.