Menekan pesan peringatan menggunakan mysql dari dalam Terminal, tetapi kata sandi ditulis dalam skrip bash

273

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 mysqltidak 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.

Blaszard
sumber
14
Cara yang disarankan adalah menyimpan kata sandi Anda dalam file opsi (seperti [client] password=my_passworddi ~/.my.cnf). Tentunya ia memiliki beberapa implikasi keamanan juga, tetapi setidaknya itu tidak dapat diakses oleh siapa saja yang dapat menjalankan ps, dan Anda memiliki kendali atas itu dengan izin file.
Anton Kovalenko
4
mysql -u root password root -e "statement" > /dev/null?
Oh, omong-omong, Anda juga dapat menggunakan sesuatu seperti Python 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 :)
6
Cara yang disarankan IMO menghukum orang yang melakukan hal yang benar untuk melindungi orang yang melakukan hal yang salah. Jika kata sandi disimpan di dalam file skrip, kata sandi itu tidak akan muncul dengan ps atau dalam log apa pun. Itu cara yang benar untuk melakukan ini. Menempatkan file dalam file eksternal memang membantu orang-orang yang akan mencatat kata sandi tetapi itu buruk untuk memulai. Sementara itu skrip yang telah berjalan selama bertahun-tahun sekarang gagal dan kita perlu memodifikasinya hanya karena peringatan ini muncul di stderr.
Nestor Urquiza
2
Untuk metode yang direkomendasikan, yang tidak menyimpan kata sandi dengan jelas, dirinci dalam dev.mysql.com/doc/refman/5.6/id/mysql-config-editor.html
anthony

Jawaban:

250

Jika versi klien / server MySQL Anda adalah cara 5.6.xa untuk menghindari pesan PERINGATAN menggunakan alat mysql_config_editor :

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

Kemudian Anda dapat menggunakan skrip shell Anda:

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

Dari pada:

mysql -u username -p pass -e "statement"
Cristian Porta
sumber
28
Ingat bahwa --login-pathharus ada sebelum semua argumen lainnya. Saya mencoba mysqldump --tables --login-path=localdan mendapatkan kesalahan unknown variable 'login-path=local'.
Tulio
Klien baris perintah mysql akan mencari di bawah jalur masuk 'klien' secara default. Anda dapat menyederhanakan instruksi menjadi "mysql -e 'statement'" dengan membuat perubahan kecil.
Morgan Tocker
2
Ini berfungsi baik jika kita langsung menjalankan file shell tetapi tidak berfungsi jika dipanggil dari crontab
Nabeel Arshad
1
@NabeelArshad Saya pikir ini karena di crontab Anda, "rumah" untuk pengguna tidak disetel (ENV vars secara umum) sehingga di crontab klien tidak dapat menemukan ~ / .mylogin.cnf yang benar
Cristian Porta
1
@NamGVU, saya tidak yakin, bagaimanapun, saya percaya bahwa solusi ini menyimpan kata sandi terenkripsi.
zhekaus
209

Saya menggunakan sesuatu seperti:

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

atau

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

Di mana config.cnf berisi:

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

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

David Goodwin
sumber
12
Catatan: --defaults-extra-fileharus menjadi opsi pertama jika mysql mengeluh mysqldump: unknown variable 'defaults-extra-file.
pevik
4
Alternatif yang luar biasa untuk jawaban yang diterima. Pasti tidak mengatur MYSQL_PWDvariabel ....
DudeOnRock
1
Pilihan yang bagus untuk versi di bawah 5.6. Kalau tidak, saya akan pergi dengan jawaban yang diterima.
dkniffin
21
Sebuah alternatif untuk membuat file .cnf sementara adalah untuk melakukan hal ini di Bash: mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement". Karena printfdijalankan oleh Bash secara langsung, itu tidak muncul di ps.
Dave James Miller
3
Saya perlu menggunakan --defaults-filedaripada --defaults-extra-file, karena yang terakhir memberikan preferensi ke pengaturan di ~ / .my.cnf.
Roger Dueck
186

Salah satu metode yang nyaman (tetapi sama-sama tidak aman) adalah menggunakan:

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

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) :

Menyimpan kata sandi Anda di MYSQL_PWDvariabel lingkungan

Metode menentukan kata sandi MySQL Anda harus dianggap sangat tidak aman dan tidak boleh digunakan. Beberapa versi ps menyertakan opsi untuk menampilkan lingkungan proses yang sedang berjalan. Pada beberapa sistem, jika Anda mengatur MYSQL_PWD, kata sandi Anda terbuka ke pengguna lain yang menjalankan ps . Bahkan pada sistem tanpa versi ps seperti itu, tidak bijaksana untuk berasumsi bahwa tidak ada metode lain yang digunakan pengguna untuk memeriksa lingkungan proses.

Ivan Dokov
sumber
6
Ini tidak berfungsi dalam skrip bash saya:Access denied for user 'root'@'localhost' (using password: NO)
rubo77
24
Dalam sebuah skrip, Anda harus melakukannya export MYSQL_PWD=whatever.
Kerusuhan
2
Karena permintaan saya sangat cepat, saya memilih opsi ini. Kemudian saya mengaturnya ke sesuatu yang palsu setelah menjalankan kueri.
TimH - Codidact
11
Dalam skrip yang tidak perlu Anda jalankan export, cukup tempatkan semuanya dalam satu baris:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD
1
@JD: bekerja untuk saya di Ubuntu 16.04 dengan MySQL 5.7.21.
mivk
70

Jika Anda ingin menggunakan kata sandi di baris perintah, saya menemukan ini berfungsi untuk memfilter pesan kesalahan tertentu:

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

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.

johnmontfx
sumber
Ini adalah solusi yang sangat baik untuk digunakan dalam tugas satu-liner yang disebut dalam tugas-tugas lain seperti membuat tugas Rake untuk penyebaran Capistrano.
JakeGould
2
Unggul dan sederhana untuk membisukan pesan itu, tidak perlu menyentuh apa pun di pengaturan MySQL.
ajaaskel
Bagaimana saya menggunakan ini dengan mysqldump di mana saya sudah memiliki redirect untuk SQL?
MacroMan
1
Ini adalah solusi yang sangat buruk dibandingkan dengan yang lain di sini. Mungkin gagal dengan versi MySQL berikutnya jika teks berubah, mungkin juga tidak berfungsi di lokal lain.
yktoo
42

Inilah cara saya mendapatkan skrip bash untuk cadangan basis data mysqldump harian agar berfungsi lebih aman. Ini adalah perluasan dari jawaban hebat Cristian Porta.

  1. 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:

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

    Itu meminta kata sandi. Setelah Anda memasukkannya, pengguna / pass disimpan terenkripsi di Andahome/system_username/.mylogin.cnf

    Tentu saja, ubah "system_username" menjadi nama pengguna Anda di server.

  2. Ubah skrip bash Anda dari ini:

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

    untuk ini:

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

Tidak ada lagi kata sandi yang terbuka.

Butkus Buttle
sumber
10

Cara termudah adalah

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
JavaGuy
sumber
43
Masalahnya adalah ini akan menekan kesalahan yang sah dalam skrip Anda juga.
man910
4
Anda juga dapat membuat file log 2> /var/log/myscript.log untuk mencatat kesalahan itu.
Skamasle
1
gunakan 2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."untuk menekan hanya peringatan yang dipermasalahkan
Hafenkranich
10

Anda juga dapat menjalankan mysql_config_editor di skrip Anda untuk memasukkan kata sandi saat menentukan jalur login

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

Ini memulai sesi harapan yang dapat digunakan dalam skrip untuk berinteraksi dengan prompt

Lihat posting ini

phylanx
sumber
Apakah itu benar-benar dimaksudkan untuk berada di sana?
David Goodwin
ya '>' dimaksudkan untuk berada di sana sehingga mysql_config_editor mengambil input dari stdout. Apa yang diteruskan dari stdout ke mysql_config_editor adalah kata sandi yang Anda inginkan untuk dimiliki pengguna ini Tanpa '>' maka yang terjadi adalah bahwa perintah gema diuraikan dan semua yang Anda lihat adalah segalanya setelah perintah gema
phylanx
Jadi, Anda bermaksud menggunakan operator pipa "|", kan? Paling tidak, di * nix dan DOS, ">" akan menangkap STDOUT dan menulisnya ke file bernama "mysql_config_editor" di direktori kerja saat ini.
Jay Dansand
Ya, Anda benar, saya telah mengedit jawaban asli saya
phylanx
7

ok, solusi tanpa file sementara atau apa pun:

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

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<(

santiago arizti
sumber
ini tidak berfungsi jika Anda sudah memiliki .my.cnffile ~/.dengan entri kata sandi
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

Untuk melihat apa yang ditulis mysql_config_editor ke file .mylogin.cnf, gunakan perintah cetak:

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

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:

shell> mysql --login-path=local

Untuk terhubung ke server jarak jauh, gunakan perintah ini:

shell> mysql --login-path=remote
Beta
sumber
Bagaimana jika saya ingin menjalankan perintah mysqldump sebagai pengguna data-www? www-data tidak memiliki direktori home ... bagaimana cara mengatur mysql_config_editor untuk pengguna data-www?
lewis4u
5

Dari 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
Nestor Urquiza
sumber
3

Alternatif lain adalah dengan menggunakan sshpass untuk memanggil mysql, misalnya:

sshpass -p topsecret mysql -u root -p username -e 'statement'
liz
sumber
Tampaknya berfungsi, tetapi Anda harus menghapus 'nama pengguna' dari baris perintah, bukan?
e2-e4
3

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.

#!/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
David G.
sumber
3
Sementara jawaban ini sedikit berbelit-belit, saya hanya menaikkannya karena sangat membuatku jengkel untuk melihat jawaban yang tidak salah secara eksplisit atau sedikit tidak konvensional mendapatkan downvotes tanpa komentar! Tidak heran David belum menjawab pertanyaan lain! Dia melompat dan mencoba membantu dengan solusi baru dan telah dibanting tanpa penjelasan mengapa! FU downvoter anonim yang tidak meninggalkan komentar!
Jeremy Davis
3
+1 menyetujui Jeremy Davis. Ini berbelit-belit, tetapi ketika dibiarkan tanpa opsi lain ini mungkin dapat diterima. Ini pasti tidak salah, tidak seperti mematikan peringatan yang harus menjadi ide paling bodoh yang pernah ada!
Ben McIntyre
1
@ JeremyDavis Ya, ini berbelit-belit, terutama karena saya ingin menunjukkan pekerjaan. Mungkin bisa dilakukan tanpa tanda kurung, tetapi mungkin kurang jelas. Ini juga aktivitas non-membaca pertama saya di semua pertukaran tumpukan ... setelah itu saya tidak menyentuhnya untuk waktu yang lama. Komentar Anda sangat dihargai.
David G.
@ David G - Senang komentar saya bermanfaat bagi Anda. Juga bagus untuk melihat bahwa Anda kembali dan bahwa jawaban Anda sekarang berada di wilayah positif. Secara pribadi, saya tidak berpikir bahwa voting tanpa komentar harus dibiarkan ... Bagaimana orang bisa belajar ketika mereka dibanting karena harus pergi ?!
Jeremy Davis
Karena itu, melihat kembali jawaban Anda, saya tidak yakin bahwa solusi permanen (pada dasarnya membungkus mysql) dengan masalah sementara (menekan pesan kesalahan untuk digunakan dalam satu skrip) adalah cara terbaik untuk melakukannya. IMO yang membungkus mysql dalam suatu fungsi di dalam skrip (menggunakan metode Anda di sini akan baik-baik saja) adalah pendekatan yang unggul. 2c saya ... :)
Jeremy Davis
3

Berikut ini adalah solusi untuk Docker dalam skrip / bin / sh:

exec buruh pelabuhan [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]"> /root/mysql-credentials.cnf'

exec buruh pelabuhan [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

docker exec [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-credentials.cnf --all-databases'

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!

program pcman
sumber
Tidak buruk. Saya hanya menggunakan satu panggilan dengan kembali, misalnya docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'Menggunakan --defaults-fileitu sudah mengambil root juga.
Matthew Wilcoxson
3

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

Joseph Shih
sumber
7
Saya akan menghindari metode ini karena ini akan membuat kesalahan sah lebih sulit untuk ditangkap
Vladimir Hraban
1

Secara pribadi, saya menggunakan pembungkus skrip untuk menangkap kesalahan itu. Berikut ini contoh kode:

#!/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
Dan
sumber
1

Untuk PowerShell ( pwsh, bukan bash), ini adalah solusi yang cukup rube-goldberg ... Upaya pertama saya adalah untuk membungkus panggilan ke mysqldalam suatu try/catchfungsi, tetapi karena beberapa perilaku aneh dalam penanganan kesalahan PowerShell , ini tidak layak.

Solusinya adalah mengesampingkan $ErrorActionPreferencecukup lama untuk menggabungkan dan menangkap STDERRdan STDOUTdan menguraikan kata ERRORdan 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. : /

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"
    }
}

Catatan: PowerShell tersedia untuk Unix, jadi solusi ini adalah lintas-platform. Itu dapat disesuaikan bashdengan 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 ERRORdi 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 mysqlhanya menambahkan opsi untuk menekan peringatan ini.

tresf
sumber
1

Jika Anda kebetulan menggunakan Rundeck untuk menjadwalkan tugas Anda, atau platform lain di mana Anda meminta mylogin.cnffile, saya telah berhasil menggunakan kode shell berikut untuk memberikan lokasi baru untuk file sebelum melanjutkan dengan panggilan 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")

Di mana MYSQL_TEST_LOGIN_FILEadalah 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 $HOMEdirektori.

Lihat dokumentasi di sini.

Patrick.SE
sumber
0

solusi terbaik adalah menggunakan alias:

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

contoh, letakkan ini di skrip Anda:

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

kemudian di skrip Anda untuk memuat basis data:

drupal-mysql database_name < database_dump.sql

untuk menjalankan pernyataan:

drupal-mysql -e "EXEC SOMESTATEMENT;"
Neil Davis
sumber
kemudian unalias the aliaas:
Neil Davis
FYI Anda tidak dapat menggunakan alias jika Anda memanggil mysql di dalam fungsi di dalam skrip.
user3616725
0

Tentukan helper:

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

Gunakan:

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

Tachaan! Kode Anda bersih dan enak dibaca

(diuji dengan bash)

volingo
sumber
-1

Solusi lain (dari skrip, misalnya):

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

The -i''pilihan sini kompatibilitas dengan Mac OS X. Standar UNIX OS dapat menggunakan lurus-i

Benoit Duffez
sumber
1
kata sandi masih pada baris perintah 'sed' sehingga tetap terlihat dalam daftar proses, meskipun hanya sebentar.
anthony
-1

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

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

Itu tidak akan menekan kesalahan, tetapi itu akan memastikan Anda dapat menggunakan output dari kueri dalam skrip bash.

WiR3D
sumber
-1

Cara termudah:

mysql -u root -p YOUR_DATABASE

Masukkan ini dan Anda harus memasukkan kata sandi.

Catatan: Ya, tanpa titik koma.

LukasNiessen
sumber
-3

Anda dapat menjalankan mySQL dan menekan pesan peringatan dan kesalahan dengan menggunakan / dev / null misalnya:

# 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

Dimana:

${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

Nikmati!

Stan Khalipa
sumber
1
Perlu diketahui bahwa ini akan menekan SEMUA pesan kesalahan, bukan hanya peringatan kata sandi itu.
Simon East
-3

Ini bekerja untuk saya - Baru ditambahkan 2> nullsetelah $(mysql_command), dan itu akan menekan pesan Kesalahan dan Peringatan saja.

MMG
sumber
1
Itu juga berarti Anda tidak mendapatkan laporan saat ada masalah lain!
anthony
Mungkin Anda juga menginginkannya 2>/dev/null. Menggunakan 2> nullhanya akan menempatkan output ke file yang disebut "null" di direktori saat ini.
thelogix