Setelah memahami masalah dengan menggunakan kata sandi di baris perintah , saya perlu menemukan cara memberi makan program dengan kata sandi tanpa menjadi masalah (tanpa kata sandi direkam di suatu tempat).
Saya memiliki skrip bash yang secara otomatis menginstal seluruh server LAMP dari sumber: Apache, FastCGI, PHP & MySQL. Instalasi ini memerlukan kata sandi, terutama MySQL.
Bagaimana saya bisa membuat skrip sepenuhnya otomatis tanpa mengungkapkan kata sandi?
Sunting (9 Juni, 3:55 UTC):
Saya memohon mysql dengan kata sandi di baris perintah, melalui root:
root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
(PASS = "p4ssw0rd" dalam kasus kami)
Dan saya mengeksekusi ps aux | grep mysql
melalui pengguna reguler saya (dor), yang tidak menunjukkan kata sandi kepada saya !
(Beberapa) ps
output adalah:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3562 0.0 0.0 34156 2864 pts/0 S+ 05:53 0:00 mysql -u root -px xxxxxx
Bagaimana itu mungkin?
Jawaban:
Sehubungan dengan pembaruan Anda:
Ketika suatu proses dimulai itu memiliki area memori khusus di mana argumen disimpan dan sebuah int yang memberitahu berapa banyak argumen yang dilewati.
MySQL memeriksa apakah kata sandi diteruskan oleh baris perintah
-p
, dan jika itu disalin ke variabel baru yang tidak terlihat, maka timpa wilayah memori itu denganx
.Secara sederhana misalnya:
Anda dapat menemukannya misalnya di
client/mysqladmin.cc
dalam kode sumber:Ketika
ps
menjalankannya membaca wilayah memori argumen, (argv[N]
), dan memang begituxxxx
.Untuk waktu yang singkat kata sandi terlihat, tetapi hanya untuk beberapa siklus CPU.
Anda dapat memperbarui kata sandi MySQL menggunakan
--init-file
opsi dan prosedur khusus. C.5.4.1.2. Menyetel Ulang Kata Sandi Root: Unix SystemsEdit:
Seperti yang dikatakan @Gilles , Anda bisa
echo
,printf
atau menggunakanhere
dokumen dari skrip.Anda juga dapat menambahkan ini ke
.my.cnf
direktori home Anda atau dalam file ( sementara ) dan gunakan--defaults-extra-file
opsi. (Percaya Anda harus menambahkan opsi itu lebih awal pada baris perintah.) Opsional juga termasuk pengguna. Juga perhatikan ekstra dalam nama pilihan kecuali jika Anda ingin menggunakan hanya file yang konfigurasi:Secara opsional
[client]
pengelompokan membuatmysqld
melewati konfigurasi.Satu juga dapat menggunakan
MYSQL_PWD
variabel lingkungan, tetapi itu tidak boleh digunakan karena Anda dapat membuat daftar lingkungan, dalam banyakps
implementasi olehps -e
, dalam/proc/<PID>/environ
file di Linux dll.Lebih banyak tentang topik di sini .
Anda mungkin juga ingin melihat Utilitas Konfigurasi MySQL yang memungkinkan Anda menyimpan kata sandi dalam file terenkripsi di direktori home Anda -
.mylogin.cnf
.sumber
mysql-init
file dengan kata sandi yang disimpan dalam variabel bash? (tanpa diungkapkan)echo 'password=p4ssw0rd' >>mysql.cnf
aman, karenaecho
ini adalah built-in, sehingga kata sandi tidak muncul pada baris perintah dari proses apa pun. Dokumen di sini juga aman.Solusi khasnya adalah membaca kata sandi dari file atau dari input standar (atau dari deskriptor file lain yang harus dilewatkan sebagai parameter).
sumber
Beberapa program (baris perintah
ftp
misalnya) membaca kata sandi dari/dev/tty
, file khusus per proses yang mewakili proses 'mengendalikan TTY. Hal ini memungkinkan program tidak menggemakan kata sandi kembali ke layar, dan memiliki sedikit lebih banyak jaminan tentang dari mana kata sandi itu berasal.sumber