Bash- und MySQL-Versionen:
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
mysql Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2
Ich habe ein Bash-Skript, das versucht, das Ergebnis einer MySQL-Abfrage in einer Variablen zu erfassen, indem es Befehle mit dem MySQL-Passwort als Variable ersetzt, die ein Dollarzeichen enthält. Egal, wie ich es versuche, die Authentifizierung schlägt immer mit der Meldung „Zugriff verweigert“ fehl oder die Abfrage gibt den MySQL-Hilfebefehlstext zurück. Ich habe Dutzende verschiedener Kombinationen beider Arten von Befehlsersetzungen und Escape-Zeichen ausprobiert, bis die Kühe nach Hause kommen. Hier ist ein Beispiel:
PASS='pass$word'; RESULT=`mysql -u user -p'${PASS}' -h RemoteHostName DBName -e "select count(*) from TableName;"`; echo "${RESULT}";
Dies gibt „Zugriff für Benutzer verweigert“ zurück …
PASS='pass$word'; RESULT=`mysql -u user -p\'${PASS}\' -h RemoteHostName DBName -e \"select count\(*\) from TableName\;\"`; echo "${RESULT}";
Dadurch wird der MySQL-Hilfetext zurückgegeben.
Ich wäre für jede Hilfe sehr dankbar, vielen Dank im Voraus.
Antwort1
Die Antwort von val0x00ff im Kommentarbereich oben war korrekt
RESULT=$(mysql -u user -p "${PASS}" -h RemoteHostName DBName -e "select count(*) from TableName;")
Antwort2
Sie müssen den Kennwortwert maskieren, nicht seine Verwendung:
PASS="pass\$word"; RESULT=`mysql -u user -p'${PASS}' -h RemoteHostName DBName -e "select count(*) from TableName;"`; echo "${RESULT}";
Da alles nach dem $ als Verweis auf eine Variable namens $word interpretiert wird
[user@host ~]$ echo "pass$word"
pass
[user@host ~]$ echo "pass\$word"
pass$word