it-swarm.com.de

Wie melde ich mich in Shell-Skripten automatisch an?

Ich habe einen MySQL-Server mit leerem root-Passwort. Ich möchte einige SQL-Anweisungen in Shell-Skripts ausführen, ohne das Kennwort wie folgt anzugeben:

config.sh:

MYSQL_ROOT="root"
MYSQL_PASS=""

mysql.sh

source config.sh
mysql -u$MYSQL_ROOT -p$MYSQL_PASS -e "SHOW DATABASES"

Wie führe ich diese SQL in Shell automatisch mit der Option -p und einem leeren Kennwort aus?

25
KeepZero

Versuche dies:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
10
Diego Basch

Alternative Möglichkeiten, diese Optionen zu schreiben.

Du kannst schreiben

mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"

leere Zeichenfolgen als separate Argumente übergeben. Ihr Kommentar unten zeigt an, dass der Client immer noch nach einem Kennwort fragt. Wahrscheinlich interpretiert es das leere Argument als Datenbanknamen und nicht als Kennwort. So können Sie stattdessen folgendes versuchen:

mysql --user="$MYSQL_ROOT" --password="$MYSQL_PASS" -e "SHOW DATABASES"

Zumindest auf meinem System führt die Einstellung von MYSQL_PASSbis "" in diesem Fall dazu, dass der Client versucht, ohne ein Kennwort zu verbinden. Wenn also zwischen einem leeren und keinem Kennwort ein Unterschied besteht, kenne ich keinen Weg, um das vorherige auf der Befehlszeile zu übergeben.

.my.cnf-Datei

Aber selbst wenn es einen Weg gibt, würde ich trotzdem vorschlagen, stattdessen eine ~/.my.cnf-Datei zu verwenden. Argumente in der Befehlszeile sind wahrscheinlich in einer von ps -A -ocmd generierten Prozessliste enthalten, sodass andere Benutzer sie sehen können. Die .my.cnf-Datei hingegen kann (und sollte) nur von Ihnen lesbar gemacht werden (mit chmod 0600 ~/.my.cnf) und wird automatisch verwendet. Lassen Sie diese Datei die folgenden Zeilen enthalten:

[client]
user=root
password=

Dann genügt ein einfacher mysql -e "SHOW DATABASES", da der Client seine Anmeldeinformationen von dieser Datei erhält.

Siehe 6.1.2.1. Endbenutzerrichtlinien für die Passwortsicherheit für die verschiedenen Möglichkeiten, wie Sie ein Passwort angeben können, sowie deren Vor- und Nachteile. Siehe 4.2.3.3. Optionsdateien verwenden für allgemeine Informationen zu dieser .my.cnf-Datei

39
MvG

Wie von MvG vorgeschlagen (empfohlen im MySQL-Handbuch 4.2.2 - und 6.1.2.1 - Sicherheitsrichtlinien ), sollten Sie eine Datei verwenden. Das Kennwort in der Befehlszeile ist möglicherweise unsicher, da ps es anderen Benutzern zeigen kann. Die Datei muss nicht .my.cnf sein. Sie kann eine Ad-hoc-Optionsdatei für Ihr Skript in einer temporären Datei sein:

OPTFILE="$(mktemp -q --tmpdir "${inname}.XXXXXX")$"
trap 'rm -f "$OPTFILE"' EXIT
chmod 0600 "$OPTFILE"
cat >"$OPTFILE" <<EOF
[client]
password="${MYSQL_PASS}"
EOF
mysql --user="$MYSQL_ROOT" --defaults-extra-file="$OPTFILE" -e "SHOW DATABASES"

Die ersten Zeilen erstellen eine sichere temporäre Datei, setzen dann die Optionen und verwenden sie dann . Trap schützt Sie vor OPTFILE, die bei Interrupts herumliegen.

13
marco

Hier ist ein kleines Bash-Skript, mit dem Sie sehr schnell eine Shell erhalten können

Es öffnet sich eine Shell, mit der Sie Abfragen manuell ausführen können. Sehr angenehm.

  #!/bin/bash
  DB_USER='your_db_username'
  DB_PASS='your_password'
  DB='database_name'
  echo 'logging into db $DB as $DB_USER'
  mysql -u "$DB_USER" --password="$DB_PASS" --database="$DB"
9
med116

In Debian GNU/Linux-Distributionen gibt es eine Datei mit dem Namen /etc/mysql/debian.cnf. Sie müssen keine weitere Datei mit den MySQL-Berechtigungsnachweisen root erstellen.

# Put in your .bashrc
alias mysql='mysql --defaults-file=/etc/mysql/debian.cnf'
alias mysqldump='mysqldump --defaults-file=/etc/mysql/debian.cnf'
1
Valerio Bozz