2017-10-10 3 views
2

Ich habe das folgende Bash-Skript, um mein Datenbankschema zu aktualisieren. Das Skript liest den Hostnamen und das Datenbankpasswort von der Befehlszeile.Mysql Kommandozeilen-Passwort mit Sonderzeichen funktioniert nicht

Das Problem ist hier, dass, wenn das Passwort alphanumerische ist z r00t dann Skript funktioniert. Wenn das Kennwort jedoch Sonderzeichen enthält, z. B. pa ** w0rd, funktioniert das Skript nicht und wird direkt beendet. Bitte hilf mir dabei. Vielen Dank.

#!/bin/bash 

echo "Enter hostname." 
read -p "Hostname [localhost]: " DB_HOST 
DB_HOST=${DB_HOST:-localhost} 

echo "Enter MySQL root password" 
DB_PASS= 
while [[ $DB_PASS = "" ]]; do 
    read -sp "Password: " DB_PASS 
done 

MYSQL="mysql --force --connect-timeout=90 --host=$DB_HOST -u root --password=${DB_PASS}" 

# Apply schema updates. My DBName is "mydb" 
# Upgrade schema file is stored in "mysql" folder 

$MYSQL mydb -e exit > /dev/null 2>&1 && $MYSQL mydb < "../mysql/upgrade_schema_v.2.1.sql" 
+0

Ändern Sie das Passwort, um nur die Zeichen zu verwenden, die Sie kennen. Aus Sicherheitsgründen sollten Sie das Passwort dann länger machen. – Ben

+0

Das Problem scheint wirklich zu sein, dass Sie versuchen, den Befehl als Zeichenfolge zu speichern. Bitte beachten Sie http://mywiki.wooledge.org/BashFAQ/050, um Code-Wiederholungen zu vermeiden, wäre es besser, hier eine Funktion anstelle einer Zeichenfolge zu verwenden, bei der Sie Schwierigkeiten haben, richtig zu zitieren. –

Antwort

1

Versuchen Sie, Ihr Passwort in Anführungszeichen zu setzen.

Wenn es pa**w0rd ist, verwenden 'pa**w0rd'

+0

Aber ich lese das Passwort von der Kommandozeile, bitte sagen Sie mir, wie soll ich es angeben? Danke – myprogram

2

Dies auftritt, weil Sie Shell-GLOB verwenden (Wildcard) Zeichen im Passwort, und in Bash (oder auf Linux im Allgemeinen) als Platzhalter wird von dem Shell erweitert.

Die sicherste und zuverlässigste Lösung besteht darin, keine Shell-Platzhalterzeichen oder andere Zeichen zu verwenden, die von der Shell im Kennwort interpretiert werden. Sie sollten auch Leerzeichen vermeiden. Es gibt viele andere Charaktere.

Hier sind die, die Sie vermeiden sollten:?

" '$, [] * {} ~ #% \ <> |

Hier sind die, die es in der Regel sicher ist Verwendung:

:; @,/+ -

.! Um sicherzustellen, dass das Passwort noch sicher ist, verlängern Sie es. Als Beispiel:

K @ 3amvv7l1wz1192sjqhym

Diese altmodischen Passwort Komplexitätsregeln erfüllt, da oben, unten, Zahlen und Sonderzeichen in den ersten vier sind, wird der Rest zufällig generiert, sondern vermeiden irgendwelche problematischen Charaktere.

Wenn Sie sie jedoch verwenden müssen, können Sie den Parameter password in einfache Anführungszeichen setzen - obwohl Sie immer noch Probleme bekommen, wenn das Passwort einfache Anführungszeichen enthält!

+0

Danke für die Antwort. Aber ich muss das Skript dazu bringen, diese Zeichen zu akzeptieren, weil es Kunden gibt, die das Passwort bereits mit diesen Zeichen verwenden. – myprogram

0

Variablen werden am besten für Daten verwendet, nicht für Code. Die Schichten von Variablen machen es schwierig, die Erweiterung zu schützen, wenn Sie Teile der Erweiterung haben wollen (d. H. Sie möchten, dass Ihre Befehlszeile auf den gewünschten Token aufgeteilt wird), möchten aber nicht alle anderen Effekte. Die Lösung besteht darin, den Code nicht in einer Zeichenfolge zu speichern. Verwenden Sie stattdessen eine Funktion wie:

do_mysql() { 
    host="$1" 
    pass="$2" 
    mysql --force --connect-timeout=90 --host="$host" -u root --password="$pass" "[email protected]" 
} 

dann können Sie es mit zusätzlichen Argumente wie

do_mysql "$DB_HOST" "$DB_PASS" -e exit > /dev/null && do_mysql "$DB_HOST" "$DB_PASS" < "../mysql/upgrade_schema_v.2.1.sql" 

laufen Obwohl es auch besser wäre nicht Großbuchstaben für Ihre Variablen zu verwenden.Auf diese Weise können Sie mit Umgebungsvariablen kollidieren und versehentlich Dinge ändern, die Sie nicht ändern möchten (z. B. die Anzahl der Personen, die PATH versehentlich zurücksetzen).

Verwandte Themen