Ketika saya mencoba menjalankan perintah berikut di MySQL dari dalam Terminal:
mysql -u $user -p$password -e "statement"
Eksekusi berfungsi seperti yang diharapkan, tetapi selalu mengeluarkan peringatan:
Peringatan: Menggunakan kata sandi pada antarmuka baris perintah dapat menjadi tidak aman.
Namun, saya harus melakukan pernyataan di atas menggunakan variabel lingkungan ( $password
) yang menyimpan kata sandi saya, karena saya ingin menjalankan perintah iteratif dalam skrip bash dari dalam Terminal, dan saya jelas tidak suka ide menunggu prompt muncul dan memaksa saya untuk memasukkan kata sandi saya 50 atau 100 kali dalam satu skrip. Jadi inilah pertanyaan saya:
Apakah layak untuk menekan peringatan? Perintah berfungsi dengan baik seperti yang saya nyatakan, tetapi jendela menjadi sangat berantakan ketika saya mengulang dan menjalankan perintah 50 atau 100 kali.
Haruskah saya mematuhi pesan peringatan dan TIDAK menulis kata sandi saya di skrip saya? Jika itu masalahnya, maka apakah saya harus mengetikkan kata sandi setiap kali diminta memaksa saya untuk melakukannya?
Berlari man mysql
tidak membantu, hanya mengatakan
--show-warnings
Penyebab peringatan akan ditampilkan setelah setiap pernyataan jika ada. Opsi ini berlaku untuk mode interaktif dan batch.
dan tidak menyebutkan apa pun tentang cara mematikan fungsionalitas, jika saya tidak melewatkan sesuatu.
Saya menggunakan OS X 10.9.1 Mavericks dan menggunakan MySQL 5.6 dari homebrew.
[client]
password=my_password
di~/.my.cnf
). Tentunya ia memiliki beberapa implikasi keamanan juga, tetapi setidaknya itu tidak dapat diakses oleh siapa saja yang dapat menjalankanps
, dan Anda memiliki kendali atas itu dengan izin file.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Ia dapat melakukan penyisipan terminal dan juga menangani umpan balik yang diberikan oleh perintah. Dengan cara ini Anda bisa melewatkan output verbose dan strip dari output aktual yang Anda inginkan :)Jawaban:
Jika versi klien / server MySQL Anda adalah cara 5.6.xa untuk menghindari pesan PERINGATAN menggunakan alat mysql_config_editor :
Kemudian Anda dapat menggunakan skrip shell Anda:
Dari pada:
sumber
--login-path
harus ada sebelum semua argumen lainnya. Saya mencobamysqldump --tables --login-path=local
dan mendapatkan kesalahanunknown variable 'login-path=local'
.Saya menggunakan sesuatu seperti:
atau
Di mana config.cnf berisi:
Ini memungkinkan Anda untuk memiliki banyak file konfigurasi - untuk berbagai server / peran / database. Menggunakan ~ / .my.cnf hanya akan memungkinkan Anda untuk memiliki satu set konfigurasi (meskipun mungkin merupakan set default yang berguna).
Jika Anda menggunakan distro berbasis Debian, dan menjalankannya sebagai root, Anda dapat melewati yang di atas dan cukup gunakan /etc/mysql/debian.cnf untuk masuk ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
sumber
--defaults-extra-file
harus menjadi opsi pertama jika mysql mengeluhmysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
variabel ....mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Karenaprintf
dijalankan oleh Bash secara langsung, itu tidak muncul dips
.--defaults-file
daripada--defaults-extra-file
, karena yang terakhir memberikan preferensi ke pengaturan di ~ / .my.cnf.Salah satu metode yang nyaman (tetapi sama-sama tidak aman) adalah menggunakan:
Perhatikan bahwa dokumen resmi merekomendasikan untuk tidak melakukannya.
Lihat 6.1.2.1 Pedoman Pengguna Akhir untuk Keamanan Kata Sandi (Manual Mysql untuk Versi 5.6) :
sumber
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, cukup tempatkan semuanya dalam satu baris:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Jika Anda ingin menggunakan kata sandi di baris perintah, saya menemukan ini berfungsi untuk memfilter pesan kesalahan tertentu:
Ini pada dasarnya mengarahkan kesalahan standar ke output standar - dan menggunakan grep untuk menghapus semua baris yang cocok dengan "Peringatan: Menggunakan kata sandi".
Dengan cara ini, Anda dapat melihat output lain, termasuk kesalahan. Saya menggunakan ini untuk berbagai skrip shell, dll.
sumber
Inilah cara saya mendapatkan skrip bash untuk cadangan basis data mysqldump harian agar berfungsi lebih aman. Ini adalah perluasan dari jawaban hebat Cristian Porta.
Pertama-tama gunakan mysql_config_editor (dilengkapi dengan mysql 5.6+) untuk mengatur file kata sandi terenkripsi. Misalkan nama pengguna Anda adalah "db_user". Menjalankan dari prompt shell:
Itu meminta kata sandi. Setelah Anda memasukkannya, pengguna / pass disimpan terenkripsi di Anda
home/system_username/.mylogin.cnf
Tentu saja, ubah "system_username" menjadi nama pengguna Anda di server.
Ubah skrip bash Anda dari ini:
untuk ini:
Tidak ada lagi kata sandi yang terbuka.
sumber
Cara termudah adalah
sumber
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
untuk menekan hanya peringatan yang dipermasalahkanAnda juga dapat menjalankan mysql_config_editor di skrip Anda untuk memasukkan kata sandi saat menentukan jalur login
Ini memulai sesi harapan yang dapat digunakan dalam skrip untuk berinteraksi dengan prompt
Lihat posting ini
sumber
ok, solusi tanpa file sementara atau apa pun:
ini mirip dengan apa yang disebutkan orang lain, tetapi di sini Anda tidak perlu file yang sebenarnya, bagian dari perintah ini memalsukan file:
<(echo ...)
(perhatikan tidak ada ruang di tengah-tengah<(
sumber
.my.cnf
file~/.
dengan entri kata sandiUntuk melihat apa yang ditulis mysql_config_editor ke file .mylogin.cnf, gunakan perintah cetak:
Perintah cetak menampilkan setiap jalur masuk sebagai kumpulan garis yang dimulai dengan tajuk grup yang menunjukkan nama jalur masuk dalam tanda kurung siku, diikuti oleh nilai opsi untuk jalur masuk. Nilai kata sandi tertutup dan tidak muncul sebagai teks yang jelas.
Seperti yang ditunjukkan oleh contoh sebelumnya, file .mylogin.cnf dapat berisi beberapa jalur masuk. Dengan cara ini, mysql_config_editor membuatnya mudah untuk mengatur beberapa "kepribadian" untuk menghubungkan ke server MySQL yang berbeda. Semua ini dapat dipilih dengan nama nanti menggunakan opsi --login-path ketika Anda menjalankan program klien. Misalnya, untuk terhubung ke server lokal, gunakan perintah ini:
Untuk terhubung ke server jarak jauh, gunakan perintah ini:
sumber
Dari https://gist.github.com/nestoru/4f684f206c399894952d
sumber
Alternatif lain adalah dengan menggunakan sshpass untuk memanggil mysql, misalnya:
sumber
Script workaroud sederhana. Beri nama ini "mysql", dan letakkan di jalur Anda sebelum "/ usr / bin". Varian yang jelas untuk perintah lain, atau jika teks peringatan berbeda.
sumber
Berikut ini adalah solusi untuk Docker dalam skrip / bin / sh:
Ganti [MYSQL_CONTAINER_NAME] dan pastikan variabel lingkungan MYSQL_ROOT_PASSWORD diatur dalam wadah Anda.
Semoga ini akan membantu Anda seperti itu bisa membantu saya!
sumber
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
Menggunakan--defaults-file
itu sudah mengambil root juga.Anda juga bisa langsung mengarahkan output kesalahan standar STDERR ke / dev / null
Jadi lakukan saja:
mysql -u $user -p$password -e "statement" 2> /dev/null
sumber
Secara pribadi, saya menggunakan pembungkus skrip untuk menangkap kesalahan itu. Berikut ini contoh kode:
sumber
Untuk PowerShell (
pwsh
, bukanbash
), ini adalah solusi yang cukup rube-goldberg ... Upaya pertama saya adalah untuk membungkus panggilan kemysql
dalam suatutry/catch
fungsi, tetapi karena beberapa perilaku aneh dalam penanganan kesalahan PowerShell , ini tidak layak.Solusinya adalah mengesampingkan
$ErrorActionPreference
cukup lama untuk menggabungkan dan menangkapSTDERR
danSTDOUT
dan menguraikan kataERROR
dan melemparkan kembali sesuai kebutuhan. Alasan kami tidak dapat menangkap dan melepaskannya"^mysql.*Warning.*password"
adalah karena PowerShell menangani dan meningkatkan kesalahan sebagai satu aliran, jadi Anda harus menangkap semuanya untuk memfilter dan melempar ulang. : /Catatan: PowerShell tersedia untuk Unix, jadi solusi ini adalah lintas-platform. Itu dapat disesuaikan
bash
dengan beberapa modifikasi sintaksis kecil.Peringatan: Ada banyak kasus tepi di mana ini tidak akan berfungsi seperti pesan kesalahan atau pernyataan non-bahasa Inggris yang mengembalikan kata
ERROR
di mana saja di output, tapi itu cukup untuk menelan peringatan untuk panggilan dasar kemysql
tanpa membom keluar seluruh skrip. Semoga yang lain menemukan ini berguna.Alangkah baiknya jika
mysql
hanya menambahkan opsi untuk menekan peringatan ini.sumber
Jika Anda kebetulan menggunakan Rundeck untuk menjadwalkan tugas Anda, atau platform lain di mana Anda meminta
mylogin.cnf
file, saya telah berhasil menggunakan kode shell berikut untuk memberikan lokasi baru untuk file sebelum melanjutkan dengan panggilan sql:Di mana
MYSQL_TEST_LOGIN_FILE
adalah variabel lingkungan yang dapat diatur ke jalur file yang berbeda dari yang standar.Ini sangat berguna jika Anda menjalankan proses bercabang dan tidak dapat memindahkan atau menyalin file ke
$HOME
direktori.Lihat dokumentasi di sini.
sumber
solusi terbaik adalah menggunakan alias:
contoh, letakkan ini di skrip Anda:
kemudian di skrip Anda untuk memuat basis data:
untuk menjalankan pernyataan:
sumber
Tentukan helper:
Gunakan:
Tachaan! Kode Anda bersih dan enak dibaca
(diuji dengan bash)
sumber
Solusi lain (dari skrip, misalnya):
The
-i''
pilihan sini kompatibilitas dengan Mac OS X. Standar UNIX OS dapat menggunakan lurus-i
sumber
Masalah yang saya miliki adalah menggunakan output dalam kondisional dalam skrip bash.
Ini tidak elegan, tetapi dalam buruh pelabuhan hal ini seharusnya tidak menjadi masalah. Pada dasarnya semua ini dilakukan adalah mengabaikan output yang tidak ada di baris terakhir. Anda dapat melakukan hal yang sama dengan awk, dan mengubah untuk mengembalikan semua kecuali baris pertama, dll.
Ini hanya mengembalikan baris Terakhir
Itu tidak akan menekan kesalahan, tetapi itu akan memastikan Anda dapat menggunakan output dari kueri dalam skrip bash.
sumber
Cara termudah:
Masukkan ini dan Anda harus memasukkan kata sandi.
Catatan: Ya, tanpa titik koma.
sumber
Anda dapat menjalankan mySQL dan menekan pesan peringatan dan kesalahan dengan menggunakan / dev / null misalnya:
Dimana:
Nikmati!
sumber
Ini bekerja untuk saya - Baru ditambahkan
2> null
setelah$(mysql_command)
, dan itu akan menekan pesan Kesalahan dan Peringatan saja.sumber
2>/dev/null
. Menggunakan2> null
hanya akan menempatkan output ke file yang disebut "null" di direktori saat ini.