Cron-Job-Datei:
46 13 * * * root /home/tmp/test_mysql.sh
Skript:
Abfrage ausführen(){ Abfrage="$1" res=`mysql --skip-column-names -e "$query"` echo "$res" } res=`execute_query "Datenbanken anzeigen"` echo $res
Fehler, den ich bekomme, wenn der Cron-Job das Skript erfolgreich ausführt:
FEHLER 1045 (28000): Zugriff für Benutzer „root“@„localhost“ verweigert (mit Passwort: NEIN)
Ich kann das Skript erfolgreich von der Befehlszeile aus als Root ausführen, da die Anmeldeinformationen für MySQL in /root/.my.cnf gespeichert sind. Was ist falsch? Liest Cronjob /root/.my.cnf irgendwie nicht?
Antwort1
Sie sollten sich nicht darauf verlassen, dass der MySQL-Client die entsprechende MySQL-Konfigurationsdatei auswählt, dakaskadierende Naturdavon, wie der Client diese Dateien liest. Stattdessen sollten Sie sowohl Ihre als auch my.cnf
in test_mysql.sh
und /home/tmp
verwenden --defaults-extra-file
[Verknüpfung]-Parameter in Ihrem Skript.
Beachten Sie, dass die --defaults-extra-file
AnforderungenErsteArgument Ihres MySQL-Befehls, sonst funktioniert es nicht.
execute_query(){
query="$1"
res=`mysql --defaults-extra-file=/home/tmp/my.cnf --skip-column-names -e "$query"`
echo "$res"
}
res=`execute_query "show databases"`
echo $res
/root
ist kein besonders guter Ort, um Dinge abzugeben (Berechtigungen usw.) und sollte vermieden werden.
Das Ausführen von Skripten, die mit einem MySQL-Server interagieren, sollte auch mit einem nicht privilegierten Benutzer durchgeführt werden.