-
Selalu beri tanda kutip ganda di sekitar penggantian variabel, jika tidak, karakter seperti spasi dan
*muncul dalam nilai ditafsirkan oleh shell. Yaitu, tulis"$c", bukan$c. -
Sintaks
mysql <"$c"membuatmysqlmengeksekusi perintah dari file yang namanya adalah nilai$c. Yang Anda cari adalahprintf '%s\n' "$c" | mysqlatau lebih sederhana, selama Anda mengingat batasannya (
$ctidak boleh dimulai dengan-, dan jika berisi\tidak apa-apa di bash tetapi tidak di beberapa varian sh lainnya)echo "$c" | mysqlAda alternatif lain yang lebih nyaman jika perintahnya multiline. Ini disebut "dokumen di sini". String
EOFtidak istimewa (meskipun tradisional), urutan huruf dan angka apa pun bisa digunakan.EOFterminasi mungkin tidak didahului oleh spasi putih. Anda harus memasukkan\sebelum setiap$,\dan`kecuali jika Anda ingin mereka ditafsirkan oleh shell.mysql <<EOF GRANT ALL ON *.* TO '$1'@'localhost'; EOF -
Berhati-hatilah jika argumen ke shell berisi kutipan tunggal, Anda memiliki vektor injeksi. Cuplikan berikut menambahkan
\sebelum setiap\dan'.set -- "${1//\\/\\\\}" set -- "${1//\'/\'}"Ini cukup jelek, itulah sebabnya jika Anda akan melakukan sesuatu yang rumit, lupakan tentang menggunakan shell dan gunakan bahasa dengan binding SQL yang sebenarnya (perl, python, apa pun) di mana perpustakaan menangani semua kutipan dan pembuatan prosedur untuk Anda .
Gunakan tanda kutip tunggal untuk string Anda:
c='GRANT ALL ON *.* TO';
c="${c} '$1'@'localhost';";
Mungkin ada cara yang lebih baik untuk melakukannya, tetapi memasukkan $1 ke dalam string membuatnya aneh
Ini akan berfungsi di bash, tidak perlu melarikan diri
#!/bin/bash
mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'"
exit 0;