-
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"
membuatmysql
mengeksekusi perintah dari file yang namanya adalah nilai$c
. Yang Anda cari adalahprintf '%s\n' "$c" | mysql
atau lebih sederhana, selama Anda mengingat batasannya (
$c
tidak boleh dimulai dengan-
, dan jika berisi\
tidak apa-apa di bash tetapi tidak di beberapa varian sh lainnya)echo "$c" | mysql
Ada alternatif lain yang lebih nyaman jika perintahnya multiline. Ini disebut "dokumen di sini". String
EOF
tidak istimewa (meskipun tradisional), urutan huruf dan angka apa pun bisa digunakan.EOF
terminasi 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;