Loại bỏ các thông báo cảnh báo bằng mysql từ bên trong Terminal, nhưng mật khẩu được viết bằng tập lệnh bash


273

Khi tôi thử chạy lệnh sau trên MySQL từ bên trong Terminal:

mysql -u $user -p$password -e "statement"

Việc thực thi hoạt động như mong đợi, nhưng nó luôn đưa ra cảnh báo:

Cảnh báo: Sử dụng mật khẩu trên giao diện dòng lệnh có thể không an toàn.

Tuy nhiên, tôi phải thực hiện câu lệnh ở trên bằng cách sử dụng biến môi trường ( $password) lưu mật khẩu của mình, vì tôi muốn chạy lệnh lặp trong tập lệnh bash từ trong Terminal và tôi chắc chắn không thích ý tưởng chờ một dấu nhắc xuất hiện và buộc tôi nhập mật khẩu của mình 50 hoặc 100 lần trong một tập lệnh. Vì vậy, đây là câu hỏi của tôi:

  • Có khả thi để ngăn chặn cảnh báo? Lệnh hoạt động đúng như tôi đã nêu, nhưng cửa sổ trở nên khá lộn xộn khi tôi lặp lại và chạy lệnh 50 hoặc 100 lần.

  • Tôi có nên tuân theo thông điệp cảnh báo và KHÔNG viết mật khẩu trong tập lệnh của mình không? Nếu đó là trường hợp, thì tôi có phải nhập mật khẩu của mình mỗi lần nhắc nhở buộc tôi phải làm như vậy không?

Chạy man mysqlkhông giúp, chỉ nói

--show-warnings
Nguyên nhân cảnh báo sẽ được hiển thị sau mỗi tuyên bố nếu có. Tùy chọn này áp dụng cho chế độ tương tác và hàng loạt.

và không đề cập gì về cách tắt chức năng, nếu tôi không thiếu thứ gì.

Tôi đang dùng OS X 10.9.1 Mavericks và sử dụng MySQL 5.6 từ homebrew.


14
Cách được đề xuất là lưu trữ mật khẩu của bạn trong một tệp tùy chọn (smth like [client] password=my_passwordin ~/.my.cnf). Chắc chắn nó cũng có một số ý nghĩa bảo mật, nhưng ít nhất nó không thể truy cập được đối với bất kỳ ai có thể chạy psvà bạn có quyền kiểm soát nó với quyền truy cập tệp.
Anton Kovalenko

4
mysql -u root password root -e "statement" > /dev/null?

Nhân tiện, bạn cũng có thể sử dụng một cái gì đó như Python pexcept. Nó có thể thực hiện chèn đầu cuối và cũng xử lý phản hồi mà lệnh đưa ra. Bằng cách này, bạn có thể bỏ qua đầu ra dài dòng và dải đầu ra thực tế mà bạn muốn :)

6
Cách IMO khuyến nghị xử phạt những người làm điều đúng để bảo vệ những người làm sai. Nếu mật khẩu được lưu trữ bên trong tệp tập lệnh, nó sẽ không hiển thị với ps hoặc trong bất kỳ nhật ký nào. Đó là cách chính xác để làm điều này. Đặt tệp vào một tệp bên ngoài sẽ giúp những người sẽ ghi lại mật khẩu nhưng điều đó thật tệ khi bắt đầu. Trong khi đó, các kịch bản đã chạy trong nhiều năm nay không thành công và chúng ta cần sửa đổi chúng chỉ vì cảnh báo này xuất hiện trong thiết bị lỗi chuẩn.
Nestor Urquiza

2
Đối với phương thức được đề xuất, whcih không lưu trữ mật khẩu rõ ràng, được nêu chi tiết trong dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html
anthony

Câu trả lời:


249

Nếu phiên bản máy khách / máy chủ MySQL của bạn là một cách 5.6.xa để tránh thông báo CẢNH BÁO đang sử dụng các công cụ mysql_config_editor :

mysql_config_editor set --login-path=local --host=localhost --user=username --password

Sau đó, bạn có thể sử dụng trong tập lệnh shell của mình:

mysql --login-path=local  -e "statement"

Thay vì:

mysql -u username -p pass -e "statement"

28
Hãy nhớ rằng --login-pathphải đến trước tất cả các đối số khác. Tôi đã cố gắng mysqldump --tables --login-path=localvà nhận được lỗi unknown variable 'login-path=local'.
Tulio

Theo mặc định, máy khách dòng lệnh mysql sẽ nhìn theo đường dẫn đăng nhập 'client'. Bạn có thể đơn giản hóa các hướng dẫn thành "mysql -e 'statement'" bằng cách thực hiện một thay đổi nhỏ.
Morgan Tocker

2
Điều này hoạt động tốt nếu chúng tôi trực tiếp thực thi tệp shell nhưng không hoạt động nếu được gọi từ crontab
Nabeel Arshad

1
@NabeelArshad Tôi nghĩ rằng điều này là do trong crontab của bạn, "nhà" cho người dùng không được đặt (nói chung là ENV) nên trong crontab, khách hàng không thể tìm thấy chính xác ~ / .mylogin.cnf
Cristian Porta

1
@NamGVU, tuy nhiên, tôi không chắc rằng giải pháp này lưu trữ mật khẩu được mã hóa.
zhekaus

209

Tôi sử dụng một cái gì đó như:

mysql --defaults-extra-file=/path/to/config.cnf

hoặc là

mysqldump --defaults-extra-file=/path/to/config.cnf 

Trong đó config.cnf chứa:

[client]
user = whatever
password = whatever
host = whatever

Điều này cho phép bạn có nhiều tệp cấu hình - cho các máy chủ / vai trò / cơ sở dữ liệu khác nhau. Sử dụng ~ / .my.cnf sẽ chỉ cho phép bạn có một bộ cấu hình (mặc dù nó có thể là một bộ mặc định hữu ích).

Nếu bạn đang sử dụng bản phân phối dựa trên Debian và đang chạy bằng root, bạn có thể bỏ qua phần trên và chỉ cần sử dụng /etc/mysql/debian.cnf để vào ...:

mysql --defaults-extra-file=/etc/mysql/debian.cnf


12
Lưu ý: --defaults-extra-filephải là tùy chọn đầu tiên nếu không mysql phàn nàn mysqldump: unknown variable 'defaults-extra-file.
pevik

4
Thay thế tuyệt vời cho câu trả lời được chấp nhận. Chắc chắn không đặt MYSQL_PWDbiến ....
DudeOnRock

1
Chắc chắn là một lựa chọn tốt cho các phiên bản dưới 5.6. Nếu không, tôi sẽ đi với câu trả lời được chấp nhận.
dkniffin

21
Một cách khác để tạo tệp .cnf tạm thời là thực hiện việc này trong Bash : mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement". Vì printfđược Bash thực hiện trực tiếp nên nó không xuất hiện ps.
Dave James Miller

3
Tôi cần phải sử dụng --defaults-filechứ không phải --defaults-extra-filevì cái sau ưu tiên cho các cài đặt trong ~ / .my.cnf.
Roger Dueck

185

Một phương pháp thuận tiện (nhưng không an toàn) là sử dụng:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

Lưu ý rằng các tài liệu chính thức đề nghị chống lại nó.
Xem 6.1.2.1 Nguyên tắc người dùng cuối về bảo mật mật khẩu (Hướng dẫn sử dụng Mysql cho phiên bản 5.6) :

Lưu trữ mật khẩu của bạn trong MYSQL_PWDbiến môi trường

Phương pháp chỉ định mật khẩu MySQL của bạn phải được coi là cực kỳ không an toàn và không nên được sử dụng. Một số phiên bản của ps bao gồm một tùy chọn để hiển thị môi trường của các tiến trình đang chạy. Trên một số hệ thống, nếu bạn đặt MYSQL_PWD, mật khẩu của bạn sẽ được hiển thị cho bất kỳ người dùng nào khác chạy ps . Ngay cả trên các hệ thống không có phiên bản ps như vậy , sẽ không khôn ngoan khi cho rằng không có phương pháp nào khác mà người dùng có thể kiểm tra môi trường xử lý.


6
Điều này không hoạt động trong tập lệnh bash của tôi:Access denied for user 'root'@'localhost' (using password: NO)
rubo77

24
Trong một kịch bản, bạn cần phải export MYSQL_PWD=whatever.
Bạo loạn

2
Bởi vì truy vấn của tôi rất nhanh, tôi đã chọn tùy chọn này. Sau đó, tôi đặt nó thành một cái gì đó không có thật sau khi thực hiện truy vấn.
TimH - Codidact

11
Trong một kịch bản bạn không cần chạy export, chỉ cần đặt tất cả trên một dòng:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD

1
@JD: hoạt động với tôi trong Ubuntu 16.04 với MySQL 5.7.21.
mivk

70

Nếu bạn muốn sử dụng mật khẩu trong dòng lệnh, tôi đã thấy rằng cách này hoạt động để lọc ra thông báo lỗi cụ thể:

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

Về cơ bản, nó chuyển hướng lỗi tiêu chuẩn sang đầu ra tiêu chuẩn - và sử dụng grep để loại bỏ tất cả các dòng khớp với "Cảnh báo: Sử dụng mật khẩu".

Bằng cách này, bạn có thể thấy bất kỳ đầu ra nào khác, bao gồm cả lỗi. Tôi sử dụng điều này cho các kịch bản shell khác nhau, vv


Đây là một giải pháp tuyệt vời để sử dụng trong các tác vụ một lớp được gọi trong các tác vụ khác như tạo tác vụ Rake để triển khai Capistrano.
JakeGould

2
Tuyệt vời và đơn giản để tắt tiếng tin nhắn đó, không cần phải chạm vào bất cứ điều gì trong thiết lập MySQL.
ajaaskel

Làm thế nào tôi có thể sử dụng điều này với mysqldump khi tôi đã có một chuyển hướng cho SQL?
Macroman

1
Đây là một giải pháp thực sự tồi tệ so với những giải pháp khác ở đây. Nó có thể thất bại với bất kỳ phiên bản tiếp theo nào của MySQL nếu văn bản thay đổi, có thể không hoạt động ở một địa điểm khác.
yktoo

42

Đây là cách tôi có tập lệnh bash để sao lưu cơ sở dữ liệu mysqldump hàng ngày để hoạt động an toàn hơn. Đây là một bản mở rộng của câu trả lời tuyệt vời của Cristian Porta.

  1. Trước tiên, hãy sử dụng mysql_config_editor (đi kèm với mysql 5.6+) để thiết lập tệp mật khẩu được mã hóa. Giả sử tên người dùng của bạn là "db_user". Chạy từ dấu nhắc shell:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password

    Nó nhắc nhập mật khẩu. Khi bạn nhập nó, người dùng / pass được lưu mã hóa tronghome/system_username/.mylogin.cnf

    Tất nhiên, thay đổi "system_username" thành tên người dùng của bạn trên máy chủ.

  2. Thay đổi tập lệnh bash của bạn từ đây:

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz

    đến đây:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz

Không tiếp xúc với mật khẩu.


10

Cách dễ nhất là

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null

43
Vấn đề là điều này cũng sẽ ngăn chặn các lỗi hợp pháp trong kịch bản của bạn.
man910

4
Ngoài ra, bạn có thể tạo tệp nhật ký 2> /var/log/myscript.log để ghi lại lỗi đó.
Skamasle

1
chỉ sử dụng 2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."để thay thế cảnh báo trong câu hỏi
Hafenkranich

10

Bạn cũng có thể chạy mysql_config_editor trong tập lệnh của mình để chuyển mật khẩu khi chỉ định đường dẫn đăng nhập

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

Điều này bắt đầu một phiên mong đợi có thể được sử dụng trong các tập lệnh để tương tác với các lời nhắc

Xem bài này


Đó có phải là '>' thực sự có nghĩa là ở đó?
David Goodwin

có '>' có nghĩa là ở đó để mysql_config_editor lấy đầu vào từ thiết bị xuất chuẩn. Cái đang được truyền từ stdout sang mysql_config_editor là mật khẩu bạn muốn người dùng này có Nếu không có '>' thì điều xảy ra là lệnh echo được phân tích cú pháp và tất cả những gì bạn sẽ thấy là tất cả sau lệnh echo
phylanx

Vì vậy, bạn có nghĩa là sử dụng toán tử đường ống "|", phải không? Ít nhất, trong * nix và DOS, ">" sẽ ghi lại STDOUT và ghi nó vào một tệp có tên "mysql_config_editor" trong thư mục làm việc hiện tại.
Jay Dansand

Vâng, bạn đã đúng, tôi đã chỉnh sửa câu trả lời ban đầu của mình
phylanx

7

ok, giải pháp không có tập tin tạm thời hoặc bất cứ điều gì:

mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"

nó tương tự như những gì người khác đã đề cập, nhưng ở đây bạn không cần một tệp thực tế, phần này của lệnh giả mạo tệp: <(echo ...) (chú ý không có khoảng trống ở giữa<(


điều này không hoạt động nếu bạn đã có một .my.cnftệp trong đó ~/.với một mục nhập mật khẩu
santiago arizti

5
shell> mysql_config_editor set --login-path=local
     --host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
     --host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here

Để xem những gì mysql_config_editor đã viết cho tệp .mylogin.cnf, hãy sử dụng lệnh in:

shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com

Lệnh in hiển thị mỗi đường dẫn đăng nhập dưới dạng một tập hợp các dòng bắt đầu bằng tiêu đề nhóm cho biết tên đường dẫn đăng nhập trong ngoặc vuông, theo sau là các giá trị tùy chọn cho đường dẫn đăng nhập. Giá trị mật khẩu được che dấu và không xuất hiện dưới dạng văn bản rõ ràng.

Như được hiển thị trong các ví dụ trước, tệp .mylogin.cnf có thể chứa nhiều đường dẫn đăng nhập. Theo cách này, mysql_config_editor giúp bạn dễ dàng thiết lập nhiều tính cách cá nhân trực tuyến để kết nối với các máy chủ MySQL khác nhau. Bất kỳ thứ nào trong số này có thể được chọn theo tên sau bằng cách sử dụng tùy chọn --login-path khi bạn gọi một chương trình máy khách. Ví dụ: để kết nối với máy chủ cục bộ, hãy sử dụng lệnh này:

shell> mysql --login-path=local

Để kết nối với máy chủ từ xa, sử dụng lệnh này:

shell> mysql --login-path=remote

Điều gì xảy ra nếu tôi muốn thực thi lệnh mysqldump với tư cách là người dùng dữ liệu www? dữ liệu www không có thư mục chính ... làm cách nào để thiết lập mysql_config_editor cho người dùng dữ liệu www?
lewis4u

5

Từ https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html

3

Một cách khác là sử dụng sshpass để gọi mysql, ví dụ:

sshpass -p topsecret mysql -u root -p username -e 'statement'

Có vẻ như để làm việc, nhưng bạn phải xóa 'tên người dùng' khỏi dòng lệnh, phải không?
e2-e4

3

Một kịch bản workaroud đơn giản. Đặt tên này là "mysql" và đặt nó vào đường dẫn của bạn trước "/ usr / bin". Các biến thể rõ ràng cho các lệnh khác, hoặc nếu văn bản cảnh báo là khác nhau.

#!/bin/sh

(
(
(
(
(
    /usr/bin/mysql "$@"
) 1>&9 
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2 
) 9>&1

3
Trong khi câu trả lời này hơi phức tạp, tôi chỉ đưa ra câu trả lời vì nó khiến tôi rất nhiều khi thấy câu trả lời không rõ ràng hoặc có một chút khác thường khi nhận được thông báo không có bình luận! Không có gì ngạc nhiên khi David không trả lời bất kỳ câu hỏi nào khác! Anh ta nhảy vào và cố gắng giúp đỡ với một giải pháp mới lạ và đã bị đánh sập mà không có lời giải thích tại sao! Những kẻ hạ bệ ẩn danh FU không để lại bình luận!
Jeremy Davis

3
+1 đồng ý Jeremy Davis. Điều này là phức tạp, nhưng khi không có lựa chọn nào khác, điều này có thể được chấp nhận. Điều đó chắc chắn không sai, không giống như tắt các cảnh báo vốn là ý tưởng ngu ngốc nhất!
Ben McIntyre

1
@JeremyDavis Vâng, điều này đã gây khó chịu, chủ yếu là vì tôi muốn thể hiện tác phẩm. Nó có thể được thực hiện mà không có dấu ngoặc đơn, nhưng có thể ít rõ ràng hơn. Đây cũng là hoạt động không đọc đầu tiên của tôi trong tất cả các trao đổi ngăn xếp ... sau đó tôi đã không chạm vào nó trong một thời gian dài. Nhận xét của bạn chắc chắn được đánh giá cao.
David G.

@DavidG. - Vui mừng nhận xét của tôi có giá trị với bạn. Cũng thật tuyệt khi thấy rằng bạn đã trở lại và câu trả lời của bạn hiện đang ở trong lãnh thổ tích cực. Cá nhân, tôi không nghĩ rằng bỏ phiếu mà không bình luận nên được cho phép ... Làm thế nào có ai học được khi họ bị đánh sập vì đã đi?!
Jeremy Davis

Có nói rằng, nhìn lại câu trả lời của bạn, tôi không tin rằng một giải pháp lâu dài (về cơ bản là bao bọc mysql) cho một vấn đề tạm thời (loại bỏ thông báo lỗi để sử dụng trong một tập lệnh) là cách tốt nhất. IMO gói mysql trong một hàm trong tập lệnh (sử dụng phương thức của bạn ở đây sẽ ổn) là một cách tiếp cận ưu việt. 2c của tôi ... :)
Jeremy Davis

3

Đây là một giải pháp cho Docker trong tập lệnh / bin / sh:

người thực hiện docker [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]"> /root/mysql-credentials.cnf'

người thực hiện docker [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

người thực hiện docker [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password = $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-Extra-file = / root / mysql-notifys.cnf --all-cơ sở dữ liệu'

Thay thế [MYSQL_CONTAINER_NAME] và đảm bảo rằng biến môi trường MYSQL_ROOT_PASSWORD được đặt trong vùng chứa của bạn.

Hy vọng nó sẽ giúp bạn như nó có thể giúp tôi!


Không tệ. Tôi chỉ sử dụng một cuộc gọi với lợi nhuận, ví dụ: docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'Sử dụng cuộc gọi --defaults-fileđó cũng đã root.
Matthew Wilcoxson

3

Bạn cũng có thể chuyển hướng đầu ra STDERR lỗi tiêu chuẩn sang / dev / null

Vì vậy, chỉ cần làm:

mysql -u $user -p$password -e "statement" 2> /dev/null


7
Tôi sẽ tránh phương pháp này vì nó sẽ khiến các lỗi hợp pháp khó bắt hơn
Vladimir Hraban

1

Cá nhân, tôi sử dụng trình bao bọc tập lệnh để bắt lỗi đó. Đây là mẫu mã:

#!/bin/bash

#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err

# Execute dumper
/usr/bin/mysqldump $@ 2>$ERR_FILE

# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE

# Handle an error
if [ "" != "$ERROR" ]; then

        # Error occured
        if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
                echo $ERROR >&2
                exit 1
        fi
fi

1

Đối với PowerShell ( pwsh, không phải bash), đây là một giải pháp khá hữu ích ... Lần đầu tiên tôi cố gắng thực hiện các cuộc gọi đến mysqlmột try/catchchức năng, nhưng do một số hành vi lạ trong xử lý lỗi PowerShell , điều này không khả thi.

Giải pháp là để ghi đè lên $ErrorActionPreferencevừa đủ dài để kết hợp và chụp STDERRSTDOUTvà phân tích cú pháp cho từ ERRORvà tái ném khi cần thiết. Lý do chúng tôi không thể bắt và phát hành "^mysql.*Warning.*password"là vì PowerShell xử lý và phát sinh lỗi dưới dạng một luồng, do đó bạn phải nắm bắt tất cả để lọc và ném lại. : /

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

Lưu ý: PowerShell có sẵn cho Unix, vì vậy giải pháp này là đa nền tảng. Nó có thể được điều chỉnh bashvới một số sửa đổi cú pháp nhỏ.

Cảnh báo: Có hàng tá các trường hợp cạnh mà điều này sẽ không hoạt động như các thông báo lỗi không phải tiếng Anh hoặc các câu trả lời từ ERRORbất cứ nơi nào trong đầu ra, nhưng nó đủ để nuốt lời cảnh báo cho một cuộc gọi cơ bản mysqlmà không ném bom toàn bộ kịch bản. Hy vọng những người khác tìm thấy điều này hữu ích.

Sẽ thật tuyệt nếu mysqlchỉ cần thêm một tùy chọn để chặn cảnh báo này.


1

Nếu bạn tình cờ sử dụng Rundeck để lên lịch cho các tác vụ của mình hoặc bất kỳ nền tảng nào khác nơi bạn yêu cầu một mylogin.cnftệp, tôi đã sử dụng thành công mã shell sau để cung cấp vị trí mới cho tệp trước khi tiến hành các cuộc gọi sql:

if test -f "$CUSTOM_MY_LOGINS_FILE_PATH"; then
   chmod 600 $CUSTOM_MY_LOGINS_FILE_PATH
   export MYSQL_TEST_LOGIN_FILE="$CUSTOM_MY_LOGINS_FILE_PATH"
fi

...

result=$(mysql --login-path=production -NBA -D $schema -e "$query")

Trường hợp MYSQL_TEST_LOGIN_FILEmột biến môi trường có thể được đặt thành một đường dẫn tệp khác với đường dẫn mặc định.

Điều này đặc biệt hữu ích nếu bạn đang chạy trong một quá trình rẽ nhánh và không thể di chuyển hoặc sao chép các tập tin vào $HOMEthư mục.

Xem tài liệu ở đây.


0

giải pháp tốt nhất là sử dụng bí danh:

alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

ví dụ, đặt điều này trong kịch bản của bạn:

alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

sau đó trong tập lệnh của bạn để tải cơ sở dữ liệu:

drupal-mysql database_name < database_dump.sql

để chạy một tuyên bố:

drupal-mysql -e "EXEC SOMESTATEMENT;"

sau đó unalias các aliaas:
Neil Davis

FYI bạn không thể sử dụng bí danh nếu bạn đang gọi mysql bên trong một hàm bên trong tập lệnh.
dùng3616725

0

Xác định người trợ giúp:

remove-warning () {
    grep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
}

Sử dụng nó:

mysql -u $user -p$password -e "statement" 2>&1 | remove-warning

Tanaan! Mã của bạn sạch sẽ và đẹp để đọc

(thử nghiệm với bash)


-1

Một giải pháp khác (ví dụ từ tập lệnh):

 sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

Các -i''tùy chọn ở đây để tương thích với Mac OS X. Chuẩn UNIX hệ điều hành có thể sử dụng thẳng-i


1
mật khẩu vẫn nằm trên dòng lệnh của 'sed' nên vẫn hiển thị trong danh sách quy trình, ngay cả khi chỉ trong một thời gian ngắn.
anthony

-1

Vấn đề tôi gặp phải là sử dụng đầu ra trong một điều kiện trong tập lệnh bash.

Điều này không thanh lịch, nhưng trong một docker env điều này thực sự không quan trọng. Về cơ bản, tất cả những điều này là bỏ qua đầu ra không nằm trên dòng cuối cùng. Bạn có thể làm tương tự với awk và thay đổi để trả về tất cả trừ dòng đầu tiên, v.v.

Điều này chỉ trả về dòng cuối cùng

mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'

Nó sẽ không khắc phục lỗi, nhưng nó sẽ đảm bảo bạn có thể sử dụng đầu ra của truy vấn trong tập lệnh bash.


-1

Cách dễ nhất:

mysql -u root -p YOUR_DATABASE

Nhập cái này và bạn sẽ cần nhập mật khẩu của bạn vào.

Lưu ý: Có, không có dấu chấm phẩy.


-3

Bạn có thể thực thi myQuery và chặn các thông báo lỗi và cảnh báo bằng cách sử dụng / dev / null chẳng hạn:

# if you run just a SQL-command
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null

# Or you can run SQL-script as a file
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null

Ở đâu:

${USERNAME} - existing mysql user

${PASSWORD} - password

${HOST}     - ip or hostname, for example 'localhost'

${DATABASE} - name of database

${STATEMENT}- SQL command

${FILEPATH} - Path to the SQL-script

thưởng thức!


1
Chỉ cần lưu ý rằng nó sẽ chặn tất cả các thông báo lỗi, không chỉ những cảnh báo mật khẩu.
Simon East

-3

Nó hoạt động với tôi - Chỉ cần thêm vào 2> nullsau $(mysql_command)và nó sẽ chỉ chặn các thông báo Lỗi và Cảnh báo.


1
Điều đó cũng có nghĩa là bạn không nhận được báo cáo khi có sự cố khác xảy ra!
anthony

Ngoài ra, bạn có thể muốn 2>/dev/null. Sử dụng 2> nullsẽ chỉ đưa đầu ra vào một tệp gọi là "null" trong thư mục hiện tại.
thelogix
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.