Datenbankkopieshellskript einschließlich Kennwort mit Sonderzeichen

501
fritzmg

Ich versuche, ein Shell-Skript für eine mysqldump(und mysql) Operation zu erstellen, bei der das Kennwort direkt im Skript gespeichert wird. Das Passwort enthält Sonderzeichen, die entsprechend behandelt werden müssen. Ich kann jedoch keine Kombination herausfinden, die tatsächlich funktioniert.

Zum Beispiel funktioniert Folgendes, wenn es direkt auf der Konsole ausgeführt wird:

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=the\$password | mysql -u the_user target_db --password=the\$password 

Das Passwort enthält ein Passwort, $das dann mit einem Escapezeichen versehen wird \$. Derselbe Befehl funktioniert jedoch nicht, wenn er in ein shell_script.sh. Beim Ausführen des Skripts beschwert sich MySQL

Access denied for user 'the_user'@'localhost' 

Bisher habe ich im Skript folgendes versucht:

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=the\$password | mysql -u the_user target_db --password=the\$password  mysqldump -u the_user --hex-blob --add-drop-table source_db --password="the\$password" | mysql -u the_user target_db --password="the\$password"  mysqldump -u the_user --hex-blob --add-drop-table source_db --password='the\$password' | mysql -u the_user target_db --password='the\$password'  mysqldump -u the_user --hex-blob --add-drop-table source_db --password="the$password" | mysql -u the_user target_db --password="the$password"  mysqldump -u the_user --hex-blob --add-drop-table source_db --password='the$password' | mysql -u the_user target_db --password='the$password' 

Nichts davon scheint das Passwort richtig zu entgehen. Von diesen funktioniert nur die erste richtig, wenn sie direkt auf der Shell verwendet wird.

Was vermisse ich? Wie muss ich das Passwort angeben, damit diese Befehle auch innerhalb eines Shell-Skripts funktionieren?

0
Ist der eigentliche problematische Charakter ein Dollarzeichen? choroba vor 5 Jahren 0
Das eigentliche Passwort enthält auch andere Sonderzeichen, wie zum Beispiel `%`, `=`, `?`, `#`. Davon muss ich jedoch nur das `\ $` entziehen - zumindest direkt auf der Shell. Das "%" steht am Anfang des Passworts, wenn dies einen Unterschied macht (was es könnte?). fritzmg vor 5 Jahren 0
"%" ist überhaupt nicht besonders. `?` kann jedoch Probleme verursachen, da es versuchen könnte, zusammenzupassen. Whitespace könnte auch ein Problem sein. Das Backslashing jedes problematischen Charakters sollte jedoch funktionieren. choroba vor 5 Jahren 0
Immer noch kein Glück. Ich habe jedes Zeichen außerhalb von [a-zA-Z0-9] zurückgesetzt, und der Befehl funktioniert immer noch nicht, wenn er über ein Skript ausgeführt wird. Es funktioniert immer noch nur, wenn es direkt in der Kommandozeile ausgeführt wird. fritzmg vor 5 Jahren 0
Sind Sie sicher, dass im Skript kein "ssh" oder eine andere zusätzliche Interpretationsebene enthalten ist? choroba vor 5 Jahren 0
Ich bin nicht sicher, was du meinst. Abgesehen von einem `echo`-Befehl vor und nach dem genannten Befehl gibt es in der` .sh`-Datei nichts anderes. fritzmg vor 5 Jahren 0
Führen Sie das Skript mit set -xv aus, um zu sehen, wie der String interpretiert wird. choroba vor 5 Jahren 0
Vielen Dank für den Vorschlag :). Anscheinend brauche ich sogar Hilfe, um _that_ zu implementieren. Wenn ich set -xv als erste Zeile in mein Skript stelle, bekomme ich nur:: invalid option_staging.sh: Zeile 1: set: -` `set: usage: set [-abefhkmnptuvxBCHP] [-o Optionsname] [-] [Argument ...] ` fritzmg vor 5 Jahren 0
Läuft das Skript in Bash? choroba vor 5 Jahren 0
In der Standardeinstellung ist dies ja. Wenn ich es über 'sh' starte, bekomme ich 'shell_script.sh: 1: set: Illegal option -`. fritzmg vor 5 Jahren 0
Der Fehler ist komisch. Haben Sie eine MSWin-Zeile, die nach 'set -xv' endet? choroba vor 5 Jahren 0
Nein, das ist mir nicht bewusst. Ich bearbeite die Datei direkt auf dem Linux-Rechner über `vi`. Dort sollte ich fehlerhafte MSWin-Zeilenenden sehen. fritzmg vor 5 Jahren 0

3 Antworten auf die Frage

0
Zhihua Lai

Versuchen Sie, das Passwort (ohne New Line und Without Escape) in eine Textdatei zu schreiben, z. B. pass.txtund verwenden Sie dann Folgendes

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=$(cat pass.txt) | mysql -u the_user target_db --password=$(cat pass.txt) 
Das hat nicht funktioniert. Ich vermute mit "ohne NR" meinst du ohne den Charakteren zu entkommen? fritzmg vor 5 Jahren 0
ohne zu entkommen und ohne die neuen Linien. Zhihua Lai vor 5 Jahren 0
Ja, das habe ich getan. Allerdings spiegelt `echo pass.txt` nicht wirklich den Inhalt von` pass.txt` wider, sondern echos `pass.txt`;) fritzmg vor 5 Jahren 0
Haben Sie "cat pass.txt" ausprobiert? Konrad Botor vor 5 Jahren 0
ja, sollte "cat pass.txt" sein. Meine Fehler Zhihua Lai vor 5 Jahren 0
0
Konrad Botor

Ich würde folgendes tun:

printf -v password "%q" "\$password" mysql --password=$password 

Weitere Details zu printf: printf auf wiki.bash-hackers.org

Das hat auch nicht (ganz) funktioniert. Auch mit Ihrer Version des `mysql`-Teils des Befehls (ohne das` = `zwischen --password` und` $ password`) lande ich einfach in der `mysql`-Schnittstelle. fritzmg vor 5 Jahren 0
Eigentlich war das Fehlen von "=" ein Tippfehler. Vielen Dank für den Hinweis. Konrad Botor vor 5 Jahren 0
Ja, das habe ich geahnt. Es funktioniert jedoch immer noch nicht :( fritzmg vor 5 Jahren 0
0
Dave

Fügen Sie das Kennwort der SQL-INI-Datei in einem separaten [mysqldump]Abschnitt hinzu. Wenn Sie es für den MySQL-Aufruf benötigen, fügen Sie es auch dem [mysql]Abschnitt der Ini-Datei hinzu.

[mysqldump] password="the$password"  [mysql] password="the$password"