Назад | Перейти на главную страницу

cronjob выполняет mysql и получает отказ в корневом доступе

файл задания cron:

46 13 * * * root /home/tmp/test_mysql.sh

сценарий:

execute_query(){
    query="$1"
     res=`mysql --skip-column-names -e "$query"`
    echo "$res"
}

res=`execute_query "show databases"`
echo $res

ошибка, которую я получил, когда задание cron успешно выполняет скрипт:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Я могу успешно выполнить сценарий из командной строки как root, потому что учетные данные для входа в mysql сохранены в /root/.my.cnf, что не так? cronjob почему-то не читает /root/.my.cnf?

Вы не должны полагаться на то, что клиент MySQL подберет соответствующий файл конфигурации MySQL из-за каскадная природа того, как клиент читает эти файлы. Вместо этого вы должны поставить оба my.cnf и test_mysql.sh внутри /home/tmp и использовать --defaults-extra-file [ссылка на сайт] в вашем скрипте.

Обратите внимание, --defaults-extra-file должен быть первый аргумент вашей команды mysql, иначе он не сработает.

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 это не очень хорошее место для размещения вещей (разрешений и т. д.), и его следует избегать.

Запуск сценариев, которые взаимодействуют с сервером MySQL, также следует выполнять с непривилегированным пользователем.