Cara meneruskan kata sandi ke baris perintah mysql


20

Saya memiliki kata sandi MySQL yang disimpan di file foo.php, misalnya P455w0rd, ketika saya mencoba menggunakannya:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

Kedua opsi masih meminta kata sandi, dari mana cara yang benar untuk mengirim kata sandi stdin?


3
tidak boleh kosong antara -pdan kata sandi Anda.
Fırat KÜÇÜK

mysql tidak membaca kata sandi dari stdin, saya tidak dapat mengetahuinya dari mana ia membacanya.
Omn

Jawaban yang tepat adalah jangan letakkan kata sandi Anda di baris perintah di mana siapa pun yang memiliki akses /procdapat dengan sepele membacanya selama program sedang berjalan . Itulah ~/.my.cnfgunanya, dengan benar diubah menjadi 0600
Shadur

Jawaban:


25

Anda harus sangat berhati-hati bagaimana Anda mengirimkan kata sandi ke baris perintah karena, jika Anda tidak hati-hati, Anda akan membiarkannya terbuka untuk mengendus menggunakan alat seperti ps.


Cara teraman untuk melakukan ini adalah membuat file konfigurasi baru dan meneruskannya dengan mysqlmenggunakan opsi baris perintah --defaults-file=atau --defaults-extra-file=.

Perbedaan antara keduanya adalah bahwa yang terakhir dibaca selain file konfigurasi default sedangkan dengan yang pertama, hanya satu file yang dilewatkan sebagai argumen yang digunakan.

File konfigurasi tambahan Anda harus berisi sesuatu yang mirip dengan:

[client]
user=foo
password=P@55w0rd

Pastikan Anda mengamankan file ini.

Lalu lari:

mysql --defaults-extra-file=<path to the new config file> [all my other options]

2
MySQL akan memodifikasinya argvuntuk menimpa parameter yang diberikan pada -pflag. Setidaknya itulah yang disimpulkan di sini, bersama dengan info relevan lainnya: unix.stackexchange.com/questions/78757/…
Kusalananda

Ini adalah solusi terbaik, karena memberikan ukuran keamanan. Anda perlu chmod go-rwx, dan pastikan argumen ini mendahului semua argumen lainnya.
ChuckCottrill

1
@ Kusalananda, ya, tapi sesuai komentar di unix.stackexchange.com/q/385339/135943 , itu tidak berarti itu aman!
Wildcard

Mungkin perlu menambahkan catatan tentang --login-pathsekarang ini didukung. Ini tidak jauh lebih baik dari ini, tetapi sedikit kurang teks biasa (meskipun penghalang untuk mengubah konten menjadi plaintext rendah).
Geoffrey Wiseman

6
Set MYSQL_PWD di lingkungan ( export MYSQL_PWD=muhpassword) dan jalankan perintah Anda tanpa -p. Lihat Variabel Lingkungan Program MySQL . Terlepas dari peringatan mengerikan manual ini , ini agak aman . Kecuali Anda memulai warez aneh di shell yang sama nanti. Jadi kita jalankan:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer

12

The mysqlutilitas klien dapat mengambil password pada baris perintah dengan baik -patau --password=pilihan.

Jika Anda menggunakan -p, tidak boleh ada ruang kosong setelah surat opsi:

$ mysql -pmypassword

Saya lebih suka opsi panjang dalam skrip karena mereka mendokumentasikan diri:

mysql --password=mypassword --user=me --host=etc

3
Ini tidak aman karena setiap pengguna dapat melihat kata sandi - baik secara langsung melalui /proc/$pid/cmdlineatau melalui psperintah. Memang benar bahwa mysql menimpa kata sandi di argv selama startup tetapi selalu ada jendela waktu di mana pengguna lain dapat mengamati kata sandi. Juga, pada beberapa sistem, penulisan ulang argv mungkin tidak berfungsi.
maxschlepzig

3

Jika Anda ingin memulai mysqldengan kata sandi asalkan Anda harus mengambil kata sandi dalam sebuah variabel terlebih dahulu:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

Kemudian Anda dapat memulai mysqlperintah Anda dengan:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver

1
Ini juga membahayakan keamanan kata sandi Anda . Perhatikan bahwa ada MYSQL_PWDvariabel lingkungan yang dibaca mysqljika Anda tidak menentukan -p. Dan di Linux ini adalah metode yang aman karena lingkungan pengguna tidak dapat dibaca oleh pengguna yang tidak diprivasi - berbeda dengan vektor argumen.
maxschlepzig
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.