Wie kann ich einen SQL-Befehl über ein Shell-Skript ausführen, damit ich ihn automatisieren kann?
Ich möchte Daten, die ich in einer SQL-Datei gesammelt habe, mithilfe eines Shell-Skripts wiederherstellen. Ich möchte eine Verbindung zu einem Server herstellen und Daten wiederherstellen. Der Befehl funktioniert, wenn er separat über die SSH-Befehlszeile ausgeführt wird.
Dies ist der Befehl, den ich benutze:
mysql -h "server-name" -u root "password" "database-name" < "filename.sql"
Dies ist der Shell-Skriptcode, der die Datei erstellt ds_fbids.sql
und in MySQL weiterleitet.
perl fb_apps_frm_fb.pl
perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql
mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Was ist der richtige Weg, um dies zu tun?
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
Dies ist die Fehlermeldung, die ich erhalten habe-p
wenn das Passwort null oder eine leere Zeichenfolge ist. Vielleicht können Sie Ihren Beitrag aktualisieren? :)Verwenden Sie diese Syntax:
quelle
"command1;command2;....;commandn"
Teils dieser Antwort funktioniert nicht. Die Verwendung als Ersatz für die Verwendung der umgeleiteten Datei in der OP-Syntax kann funktionieren. Ich habe dieses Problem in meiner Antwort auf diese Frage angesprochen .Alle vorherigen Antworten sind großartig. Wenn es sich um einen einfachen, einzeiligen SQL-Befehl handelt, den Sie ausführen möchten, können Sie auch die Option -e verwenden.
quelle
Verwenden Sie die folgende Syntax, um ein SQL-Skript auszuführen:
Wenn Sie Host als localhost verwenden, müssen Sie es nicht erwähnen. Sie können dies verwenden:
Dies sollte für Windows und Linux funktionieren.
Wenn der Passwortinhalt ein
!
(Ausrufezeichen) enthält, sollten Sie einen\
(Backslash) davor einfügen.quelle
Der Kern der Frage wurde bereits mehrmals beantwortet. Ich dachte nur, ich würde hinzufügen, dass Backticks sowohl in Shell-Scripting als auch in SQL Beaning haben. Wenn Sie sie in SQL zum Angeben eines Tabellen- oder Datenbanknamens verwenden müssen, müssen Sie sie im Shell-Skript wie folgt maskieren:
Natürlich sollte das Generieren von SQL durch verkettete Benutzereingaben (übergebene Argumente) nur durchgeführt werden, wenn Sie der Benutzereingabe vertrauen. Es wäre viel sicherer, es in eine andere Skriptsprache mit Unterstützung für Parameter zu übertragen / Zeichenfolgen zum Einfügen korrekt zu maskieren in MySQL.
quelle
(Verwenden Sie
sql_script_file
bei Bedarf den vollständigen Pfad )Wenn Sie den Ausgang in eine Datei umleiten möchten
quelle
Sie haben vergessen
-p
oder--password=
(letzteres ist besser lesbar):(Die Anführungszeichen sind nicht erforderlich, wenn Sie sicher sind, dass Ihre Anmeldeinformationen / Namen kein Leerzeichen oder Shell-Sonderzeichen enthalten.)
Beachten Sie, dass auch in der Manpage angegeben ist, dass die Angabe der Anmeldeinformationen in der Befehlszeile unsicher ist. Befolgen Sie also Bills Ratschläge zu my.cnf.
quelle
Wie bereits erwähnt, können Sie mit -p das Kennwort an den Server übergeben.
Aber ich empfehle dies:
Beachten Sie, dass das Passwort nicht vorhanden ist. Es würde Sie dann zur Eingabe des Passworts auffordern. Ich würde es dann eingeben. Damit Ihr Passwort nicht im Befehlszeilenverlauf des Servers angemeldet wird.
Dies ist eine grundlegende Sicherheitsmaßnahme.
Wenn die Sicherheit kein Problem darstellt, würde ich das Kennwort nur vorübergehend vom Datenbankbenutzer entfernen. Dann nach dem Import - fügen Sie es erneut hinzu.
Auf diese Weise werden andere Konten, die möglicherweise dasselbe Kennwort haben, nicht gefährdet.
Es scheint auch, dass Sie in Ihrem Shell-Skript nicht warten / prüfen, ob die zu importierende Datei tatsächlich vorhanden ist. Das Perl-Skript ist möglicherweise noch nicht fertig.
quelle
perl fb_apps_frm_fb.pl
</ br> perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql` </ br>mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Verwenden
quelle
Um „Automate“ der Prozess der erzeugten Import -
.sql
Datei, während all Fallen zu vermeiden, die bei dem Versuch , versteckt werden können Dateien durchlaufenstdin
undstdout
nur MySQL anweisen , die erzeugte auszuführen.sql
Datei mit demSOURCE
Befehl in MySQL.Die Syntax in der kurzen, aber ausgezeichneten Antwort von Kshitij Sood bietet den besten Ausgangspunkt. Kurz gesagt, ändern Sie den Befehl des OP gemäß der Syntax von Kshitij Sood und ersetzen Sie die darin enthaltenen Befehle durch den folgenden
SOURCE
Befehl:Wenn der Datenbankname in der generierten
.sql
Datei enthalten ist, kann er aus dem Befehl entfernt werden.Hierbei wird davon ausgegangen, dass die generierte Datei als eigenständige Datei gültig ist
.sql
. Da die Datei nicht umgeleitet, weitergeleitet oder auf andere Weise von der Shell verarbeitet wird, ist es kein Problem, aufgrund der Shell eines der Zeichen in der generierten Ausgabe zu maskieren. Die Regeln in Bezug auf das, was in einem entkommen muss.sql
Datei maskiert werden muss, gelten natürlich weiterhin.Der Umgang mit Sicherheitsproblemen rund um das Kennwort in der Befehlszeile oder in einer
my.cnf
Datei usw. wurde in anderen Antworten mit einigen hervorragenden Vorschlägen ausführlich behandelt. Meine Lieblingsantwort von Danny behandelt dies, einschließlich des Umgangs mit dem Problem beim Umgang mitcron
Jobs oder irgendetwas anderem.Um einen Kommentar (Frage?) Zu der kurzen Antwort zu adressieren, die ich erwähnt habe: Nein, sie kann nicht mit einer HEREDOC-Syntax verwendet werden, da dieser Shell-Befehl gegeben wird. HEREDOC kann in der Syntax der Umleitungsversion verwendet werden (ohne die
-Bse
Option), da HEREDOC auf der E / A-Umleitung basiert. Wenn Sie die Funktionalität von HEREDOC benötigen, ist es besser, sie beim Erstellen einer.sql
Datei zu verwenden, auch wenn es sich um eine temporäre Datei handelt, und diese Datei als "Befehl" für die Ausführung mit der MySQL-Stapelzeile zu verwenden.Beachten Sie, dass Sie aufgrund der Shell-Erweiterung Shell- und Umgebungsvariablen im HEREDOC verwenden können. Der Nachteil ist, dass Sie jedem Backtick entkommen müssen. MySQL verwendet sie als Trennzeichen für Bezeichner, aber die Shell, die zuerst die Zeichenfolge erhält, verwendet sie als Trennzeichen für ausführbare Befehle. Verpassen Sie die Flucht mit einem einzigen Backtick der MySQL-Befehle, und das Ganze explodiert mit Fehlern. Das gesamte Problem kann mithilfe eines zitierten LimitString für das HEREDOC gelöst werden:
Durch das Entfernen der Shell-Erweiterung auf diese Weise müssen die Backticks und andere Shell-Sonderzeichen nicht mehr entfernt werden. Außerdem wird die Möglichkeit entfernt, Shell- und Umgebungsvariablen darin zu verwenden. Damit entfallen die Vorteile der Verwendung eines HEREDOC im Shell-Skript.
Die andere Option besteht darin, die in Bash zulässigen mehrzeiligen Zeichenfolgen in Anführungszeichen mit der Batch-Syntaxversion (mit dem
-Bse
) zu verwenden. Ich kenne keine anderen Muscheln, daher kann ich nicht sagen, ob sie auch darin funktionieren. Sie müssten dies ohnehin verwenden, um mehr als eine.sql
Datei mit demSOURCE
Befehl auszuführen , da dies nicht;
wie andere MySQL-Befehle durch a beendet wird und nur eine pro Zeile zulässig ist. Die mehrzeilige Zeichenfolge kann entweder in einfachen oder doppelten Anführungszeichen stehen, mit den normalen Auswirkungen auf die Shell-Erweiterung. Es hat auch die gleichen Einschränkungen wie die Verwendung der HEREDOC-Syntax für Backticks usw.Eine potenziell bessere Lösung wäre die Verwendung einer Skriptsprache, Perl, Python usw., um die
.sql
Datei wie im OP zu erstellen , undSOURCE
diese Datei mit der einfachen Befehlssyntax oben. Die Skriptsprachen sind bei der Manipulation von Zeichenfolgen viel besser als die Shell und die meisten verfügen über integrierte Verfahren, um das Zitieren und Escape-Verhalten im Umgang mit MySQL zu bewältigen.quelle
Eine wichtige Überlegung für den Zugriff auf mysql über ein in cron verwendetes Shell-Skript ist, dass mysql den angemeldeten Benutzer überprüft, um eine zu ladende .my.cnf zu ermitteln.
Das funktioniert mit cron nicht. Es kann auch verwirrend werden, wenn Sie su / sudo verwenden, da der angemeldete Benutzer möglicherweise nicht der Benutzer ist, als den Sie ausgeführt werden.
Ich benutze so etwas wie:
Stellen Sie einfach sicher, dass Benutzer- und Gruppenbesitz und -berechtigungen in der Datei .my.cnf richtig und genau festgelegt sind.
quelle
quelle
Wie führe ich eine Befehlszeile mit einem sicheren Passwort aus? benutze den Konfigurationseditor !!!
Ab MySQL 5.6.6 können Sie das Passwort in einer Konfigurationsdatei speichern und dann solche CLI-Befehle ausführen ....
--login-path ersetzt Variablen ... Host, Benutzer UND Passwort. ausgezeichnet richtig!
quelle
Ich habe ein Shell-Skript geschrieben, das Daten aus der Eigenschaftendatei liest und dann ein MySQL-Skript für ein Shell-Skript ausführt. Dies zu teilen kann anderen helfen.
quelle