Jika saya login dengan kata sandi root pada kotak saya, saya cukup mengetik
mysqldump --all-database dan saya akan mendapatkan "Dump" yang diharapkan.
Saya mengatur pekerjaan di cron.daily untuk menjalankan dan membuang ini ke drive cadangan. Masalah yang saya miliki adalah bahwa meskipun pengguna berjalan sebagai root, saya mendapatkan pesan berikut
mysqldump: Ada kesalahan: 1045: Akses ditolak untuk pengguna 'root' @ 'localhost' (menggunakan kata sandi: TIDAK)
ketika mencoba terhubung. Saya tidak ingin kode hard password root database mysql di skrip (siapa yang mau).
Menimbang bahwa saya bisa mengetik "mysqldump" di baris perintah di bash shell saya harus ada cara untuk berkeliling menggunakan parameter -u. Saya sudah memiliki #! / Bin / bash di bagian atas skrip.
Apa yang saya lewatkan di sini agar tidak meminta kata sandi root ke database?
Keamanan seharusnya tidak dilakukan melalui ketidakjelasan. Jika Anda takut seseorang memiliki akses ke akun root Anda, tidak masalah apakah kata sandi root mysql disimpan dalam skrip, karena Anda memiliki semua data yang tersedia di dump mysql, atau file database. Jadi, pertanyaan sebenarnya adalah apa yang Anda coba lindungi?
Jika Anda tidak ingin orang lain mendapatkan kata sandi yang akan memungkinkan mereka mengubah data dalam database Anda, Anda harus membuat pengguna dengan izin yang sesuai .
Jika Anda tidak ingin kata sandi mysql dilihat oleh akun lokal mana pun kecuali izin file root set pada skrip tersebut menjadi 0700 dan pemilik untuk melakukan root.
sumber
Penggunaan shell Anda dapat melakukannya karena Anda memiliki shell untuk menjalankannya, yaitu ketika Anda masuk, semua skrip shell Anda di profil Anda dijalankan.
Cron tidak memiliki kemewahan seperti itu. Ketika logon (sebagai root) akan masuk dengan shell default. Ini mencegah siapa pun untuk masuk dari jarak jauh, tetapi itu juga berarti tidak ada skrip login otomatis yang dijalankan.
Anda dapat mengatur agar cron dijalankan di bawah, edit crontab dan tambahkan variabel SHELL dan HOME, mis.
jika ini tidak disetel, maka cron akan berjalan dengan direktori shell dan home yang ditentukan di / etc / passwd (yang mungkin bukan apa-apa, mungkin / bin / sh).
Jika Anda ingin melihat lingkungan cron berjalan, tambahkan pekerjaan cron yang mengekspor env ke file, misalnya:
sumber
Jika skrip dijalankan oleh root, Anda dapat membuat file /root/.my.cnf dengan izin 600 dan konten berikut:
(tempat Anda memasukkan nama pengguna dan kata sandi MySQL Anda tentu saja).
File ini akan secara otomatis dibaca oleh piranti baris perintah mysql, jika dijalankan sebagai root. Tidak perlu lagi menyediakannya di command-linea. 600 izin melindunginya dari pengintaian.
sumber
Cron bisa sangat menyebalkan untuk debug. Ketika pekerjaan cron dijalankan, mereka tidak memiliki lingkungan yang ditetapkan seperti yang Anda terima dengan sebuah shell.
Kiat untuk cron:
Jika pengguna root Anda dapat melakukannya dari shell, cron harus dapat melakukannya. Pastikan Anda secara spesifik menentukan file konfigurasi untuk digunakan pada baris perintah.
sumber
Meskipun beberapa respons ini sangat membantu, beberapa membingungkan karena pengguna root unix dan pengguna root mysql tidak sama dan pada dasarnya tidak memiliki hubungan selain mereka berdua menggunakan nama login 'root'. Mungkin itu sudah jelas tetapi tampaknya beberapa tanggapan membingungkan keduanya.
Apa yang mungkin merupakan opsi yang berguna (mungkin ada?) Untuk mysqld akan memungkinkan program klien seperti mysql atau mysqldump dll berjalan sebagai root unix untuk mengakses root mysqld @ localhost tanpa kata sandi tanpa harus menyimpan kata sandi root @ localhost (mysql) dalam file my.cnf atau yang serupa.
Saya tahu itu membuat sedikit gugup tetapi alasannya adalah siapa pun yang berjalan sebagai lokal (ke server mysqld) root unix dapat memotong keamanan mysqld, cukup mudah. Dan memiliki my.cnf dengan password root mysqld 7x24 atau bahkan membuat / menghapus my.cnf dengan password root mysql (dari mana kata sandi itu berasal?) Dengan cepat (misalnya, untuk melakukan mysqldump) membuat saya gugup.
Dibutuhkan beberapa infrastruktur dan pemikiran karena kita harus mempercayai mysql / mysqldump / etc untuk mentransmisikan ke mysqld yang benar-benar percaya itu dijalankan oleh akun root unix lokal.
Tetapi misalnya membatasi hanya unix socket mysqld, tidak ada TCP, bisa membantu, setidaknya sebagai opsi yang sangat direkomendasikan untuk opsi ini. Itu bisa menetapkan bahwa klien berjalan secara lokal yang mungkin tidak cukup. Tapi itu bisa menjadi awal dari sebuah ide. Mungkin mengirim deskriptor file melalui soket unix bisa menjadi bagian lain (google jika kedengarannya seperti pembicaraan gila.)
PS Tidak. Saya tidak akan mencoba untuk bertukar pikiran di sini bagaimana semua itu dapat bekerja pada sistem operasi non-unix yang mungkin diterjemahkan ke OS lain.
sumber
/root/.my.cnf
dengan izin yang tepat akan menyelesaikan masalah dengan baik.