Kết nối với dòng lệnh máng MySQL mà không cần mật khẩu root


11

Tôi đang xây dựng một kịch bản Bash cho một số nhiệm vụ. Một trong những nhiệm vụ đó là tạo ra một DB DB từ trong cùng một tập lệnh bash. Những gì tôi đang làm bây giờ là tạo hai vars: một cho tên người dùng cửa hàng và một cho mật khẩu cửa hàng. Đây là phần có liên quan trong kịch bản của tôi:

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

Nhưng luôn gặp lỗi khi truy cập bị từ chối đối với root người dùng mà KHÔNG CÓ MẬT KHẨU, tôi đang làm gì sai? Tôi cần phải làm tương tự cho PostgreSQL.


Thực hiện một số gỡ lỗi (-: Hãy thử echo "$MYSQL_PASS"trước khi bạn chuyển nó đến mysqldòng. Nó có mật khẩu chính xác không?
KM.

Bạn có thể đăng nhập như bình thường mà không có kịch bản?
qweet

4
-h bị mất tích. Nó cũng không phải là một ý tưởng tốt để đặt mật khẩu trên một dòng lệnh, vì chúng sẽ hiển thị cho mọi người gọi ps wwaux.
Nils

Câu trả lời:


23

Cả cho MySQL và PostgreSQL, bạn có thể chỉ định người dùng và mật khẩu của mình trong tệp cấu hình cục bộ. .my.cnf cho MySQL và .pgpass cho PostgreSQL. Các tệp này phải nằm trong thư mục chính của bạn (ví dụ ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Bạn có thể có một mục ký tự đại diện ở đây, thay thế bất kỳ trường nào cho *******.

PS: ĐỪNG BAO GIỜ ĐẶC BIỆT MỘT MẬT KHẨU TRÊN ĐƯỜNG TUYỆT VỜI! Điều này có thể hiển thị hoàn hảo với ps nếu hệ thống của bạn không được cấu hình để không hiển thị các quy trình thuộc về người dùng khác.

@thinice: Nếu bạn muốn tạo những tệp đó thực sự an toàn, bạn nên làm:

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

Bằng cách này, tệp sẽ được tạo với các quyền an toàn ngay từ đầu và không kẻ nghe trộm nào có cơ hội lấy mật khẩu của bạn.

PostgreSQL sẽ từ chối sử dụng tệp có quyền cao hơn 0600.


1
Đối với mysql máy khách mysql bạn có thể trỏ đến một tệp cấu hình cụ thể với --defaults-extra-file=filename. Điều này có thể hữu ích nếu bạn muốn đặt nó ở một nơi không chuẩn hoặc chỉ tạo một tệp tạm thời. Có nghi ngờ rằng chúng là một tùy chọn tương tự với PostgreSQL, nhưng tôi không quen với điều đó.
Zoredache

1
Và vì tình yêu hạnh phúc của quần short 0600
gilmore

@kworr Tôi sẽ cố gắng thử điều đó nhưng MySQL của tôi không bắt đầu thay đổi các tham số này tại /etc/my.cnf :( không biết nguyên nhân. Tôi sẽ thử lại sau
ReynierPM

Đó không phải là /etc/my.cnf. Cập nhật câu trả lời.
kworr

@kworr Tôi thử giải pháp của bạn nhưng không hoạt động. DB được tạo bởi trống và không xuất hiện trong phpMyAdmin hoặc bất kỳ công cụ GUI nào khác. Tôi đặt thư mục dữ liệu trong /etc/my.cnf thành datadir = / data / var / lib / mysql và đặt quyền thành 0755 tại / data / var / lib / mysql và cũng là chủ sở hữu thành mysql: mysql, tại sao cơ sở dữ liệu trống ? vấn đề ở đâu?
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 

Điều này sẽ thực hiện các mẹo


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

Làm cách nào để thực thi một dòng lệnh với mật khẩu an toàn ?? sử dụng trình chỉnh sửa cấu hình !!!

Kể từ mysql 5.6.6, bạn có thể lưu mật khẩu trong tệp cấu hình và sau đó thực thi các lệnh cli như thế này ....

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

--login-path thay thế các biến ... máy chủ, người dùng VÀ mật khẩu. xuất sắc đúng không!



1
Cám ơn vì đã chia sẻ! Chỉ có một gotcha từ phương pháp này. Tham số --login-path phải là tham số đầu tiên của cuộc gọi, nếu không bạn sẽ nhận được thông báo "biến không xác định '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

hãy chắc chắn làm thế nào bạn viết vượt qua của bạn và nó không thoát

--defaults-Extra-file = là một điều tốt (tm) (c)


1

Đừng đặt dấu ngoặc kép quanh mật khẩu vì nếu bạn thực hiện các trích dẫn được coi là một phần của mật khẩu.


0

Câu hỏi tương tự tồn tại trên StackOverflow.

Để tóm tắt câu trả lời của tôi từ đó.

Bạn có thể export MYSQL_PWD=yourverysecretpassword.

Mặt trái của phương pháp này khi sử dụng tệp cấu hình là bạn không cần tệp cấu hình riêng để giữ đồng bộ với tập lệnh của mình. Bạn chỉ có kịch bản để duy trì.

Không có nhược điểm của phương pháp này.

Mật khẩu không hiển thị cho những người dùng khác trên hệ thống (nó sẽ hiển thị nếu nó nằm trên dòng lệnh). Các biến môi trường chỉ hiển thị cho người dùng đang chạy lệnh mysql và root.

Mật khẩu cũng sẽ hiển thị cho bất cứ ai có thể đọc chính tập lệnh, vì vậy hãy đảm bảo rằng tập lệnh được bảo vệ. Điều này không có gì khác với việc bảo vệ một tệp cấu hình. Bạn vẫn có thể lấy mật khẩu từ một tệp riêng nếu bạn muốn tập lệnh có thể đọc được công khai ( export MYSQL_PWD=$(cat /root/mysql_password)ví dụ). Vẫn dễ xuất một biến hơn là xây dựng tệp cấu hình.

Ví dụ,

$ 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 */;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.