-
Náhrady proměnných vždy umístěte do dvojitých uvozovek, jinak znaky jako mezery a
*
objevující se v hodnotě jsou interpretovány shellem. Napište"$c"
, nikoli$c
. -
Syntaxe
mysql <"$c"
dělámysql
spouštět příkazy ze souboru, jehož název má hodnotu$c
. To, co hledáte, jeprintf '%s\n' "$c" | mysql
nebo jednodušší, pokud si pamatujete omezení (
$c
nesmí začínat-
a pokud obsahuje\
to je v pořádku v bash, ale ne v některých jiných variantách sh)echo "$c" | mysql
Existuje další alternativa, která je pohodlnější, pokud je příkaz víceřádkový. Říká se tomu „dokument zde“. Řetězec
EOF
není speciální (ačkoli je tradiční), postačí jakákoli sekvence písmen a číslic. UkončovacíEOF
nemusí ne předcházet mezery. Musíte zadat\
před každým$
,\
a`
pokud nechcete, aby byly interpretovány shellem.mysql <<EOF GRANT ALL ON *.* TO '$1'@'localhost'; EOF
-
Pozor, pokud argument shellu obsahuje jedinou uvozovku, máte injektážní vektor. Následující fragment přidá
\
před každým\
a'
.set -- "${1//\\/\\\\}" set -- "${1//\'/\'}"
To je docela ošklivé, a proto, pokud se chystáte dělat něco složitého, zapomeňte na použití shellu a použijte jazyk se skutečnými vazbami SQL (perl, python, cokoliv), kde za vás všechny citace a vytváření procedur zpracovává knihovna. .
Pro řetězec použijte jednoduché uvozovky:
c='GRANT ALL ON *.* TO';
c="${c} '$1'@'localhost';";
Pravděpodobně existuje lepší způsob, jak to udělat, ale zahrnutím $ 1 do řetězce to bylo divné
To bude fungovat v bash, není nutné žádné escapování
#!/bin/bash
mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'"
exit 0;