Bash und MySQL Escape Problem

Hallo liebe Community,

ich versuche mich gerade an ein paar Scripten mit OpenVPN und bis jetzt bin ich damit auch klar gekommen. Nun stehe ich leider vor einem Problem was ich auch nach längerem Suchen und Probieren nicht lösen konnte.

Vielleicht könnte ja mal ein Profi über den kleinen Codeschnipsel schaun und mir einen Tipp geben.

Code:
#!/bin/bash
echo Path: $1 > /tmp/openvpntest.log
MYSQL=(`mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT `ip`, `redirect` FROM users WHERE username = 'xxxxxx'"`)
echo ${MYSQL[0]} >> /tmp/openvpntest.log
echo ${MYSQL[1]} >> /tmp/openvpntest.log

Das Problem scheint in der Auswertung des MySQL Ausdrucks zu sein. Anscheinend wird auch `ip` als Funktion ausgewertet, was natürlich schiefgeht. Mit \`ip\` habe ich es auch schon versucht aber das hatte keinen Effekt.

Über ein paar Tipps, vielleicht auch für eine schönere Lösung des Problems, würde ich mich freuen
Grüße
Terminatorthee
 
Code:
MYSQL=$(mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT `ip`, `redirect` FROM users WHERE username = 'xxxxxx'")
 
Vielen Dank für den Tipp. Klappt zwar noch nicht so ganz:

Code:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '  FROM users WHERE username = 'xxxxxx'' at line 1
root@mastermind: /etc/openvpn/server/ccd #

Aber wenn man jetzt noch die ` mit \` escaped geht es.

Code:
root@mastermind: /etc/openvpn/server/ccd # MYSQL=$(mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT \`ip\`, \`redirect\` FROM users WHERE username = 'Terminatorthree'")
root@mastermind: /etc/openvpn/server/ccd # echo ${MYSQL}
ip redirect 192.168.7.200 1

Kannst du mir jetzt vielleicht auch noch sagen, wie ich auf die einzelnen Elemente davon zugreifen kann? Mit ${MYSQL[1] scheint es nicht zu gehen. Ich brauche die IP als auch die 1 in einer Variablen. Oder ist es einfacher dafür 2 Abfragen zu verwenden?
 
Nein das geht leider nicht, dann werden 'ip' und 'redirect' nicht als Spalten erkannt sondern als MySQL-String und einfach so wieder ausgegeben.
Code:
root@mastermind: /etc/openvpn/server/ccd # MYSQL=$(mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT 'ip', 'redirect' FROM users WHERE username = 'Terminatorthree'")
root@mastermind: /etc/openvpn/server/ccd # echo ${MYSQL}
ip redirect ip redirect

Der MySQL Select scheint ja auch mit der Version von vorher zu funktionieren aber wie bekomme ich da jetzt die einzelnen Werte raus?
 
Sorry, war noch ein Schritt vorher.

Probier mal:

MYSQL=`mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT 'ip', 'redirect' FROM users WHERE username = 'Terminatorthree'"`
 
Nein nein ich glaube du verstehst mich falsch: Der MySQL Befehl den ich oben gepostet habe geht. Ich habe nun nur noch das Problem die Ergebnisse richtig zu verarbeiten.

P.S.: Die Spaltennamen dürfen bei MySQL nicht in ' stehen, dann werden sie einfach als String ausgegeben
Code:
root@mastermind: /etc/openvpn/server/ccd # MYSQL=`mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT 'ip', 'redirect' FROM users WHERE username = 'Terminatorthree'"`
root@mastermind: /etc/openvpn/server/ccd # echo ${MYSQL}
ip redirect ip redirect
 
Bei echo -n gibts genau die selbe Ausgabe, nur das am Ende der Zeilenumbruch fehlt. Ich habe irgendwie gelesen, das man die Wörter mit awk trennen könnte, aber leider habe ich da so gar keine Ahnung von.
Code:
root@mastermind: /etc/openvpn/server/ccd # MYSQL=$(mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT \`ip\`, \`redirect\` FROM users WHERE username = 'Terminatorthree'")
root@mastermind: /etc/openvpn/server/ccd # echo -n ${MYSQL}
ip redirect 192.168.7.200 1root@mastermind: /etc/openvpn/server/ccd #
 
Normalerweise solltest du die ´` auch einfach weglassen können.

Das stimmt zwar, geht aber nur so lange wie die Spaltennamne kein - o.Ä enthalten (was hier aber passieren kann)

mr_brain:281577 said:
Wenn du lediglich den mySQL auf der Shell ausführst, hast du dann Zeilenumbrüche?

Dann sieht die Ausgabe so aus:
Code:
root@mastermind: /etc/openvpn/server/ccd # mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT \`ip\`, \`redirect\` FROM users WHERE username = 'Terminatorthree'"
+---------------+----------+
| ip            | redirect |
+---------------+----------+
| 192.168.7.200 |        1 | 
+---------------+----------+
root@mastermind: /etc/openvpn/server/ccd #

mr_brain:281578 said:
ggf. auch mal den mySQL-Befehl mit Option -e "mysql -e ..." aufrufen.
Was meinst du damit? Ich rufe doch mysql mit -e auf?
 
Also ich würde die Sache gerne an dieser Stelle nochmal zusammenfassen:
1. Der MySQL Befehlt funktioniert richtig, vielen Dank dafür
2. Wie kann ich aber nun aus der Ausgabe "ip redirect 192.168.7.200 1" die letzten beiden Wörter extrahieren? Also wie kann ich den String am Leerzeichen zerlegen?
 
Last edited by a moderator:
Ah vielen Dank genau das habe ich noch gesucht. Jetzt sollte die Sache funktionieren

Super, nochmals vielen Dank an alle.

Falls es noch wen interessiert:

Code:
root@mastermind: /etc/openvpn/server/ccd # MYSQL=$(mysql -uopenvpn -popenvpn -Dopenvpn -e "SELECT \`ip\`, \`redirect\` FROM users WHERE username = 'Terminatorthree'")
root@mastermind: /etc/openvpn/server/ccd # echo $MYSQL | cut -d" " -f3
192.168.7.200
root@mastermind: /etc/openvpn/server/ccd # echo $MYSQL | cut -d" " -f4
1
 
Back
Top