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

mysqldump подключается как другой пользователь из cron и из командной строки

У меня была ошибка в сценарии резервного копирования, запущенном как задание cron, которое я нашел и исправил, но меня все еще озадачивает тот факт, что эта ошибка не проявлялась при запуске сценария из командной строки. Сам скрипт запускается как root, а в какой-то момент запускает другой скрипт от имени другого пользователя (фактически как mysql).

su another_user -c "/some/path/another_script"

другой_скрипт, в свою очередь, в какой-то момент делает дамп базы данных:

mysqldump db_name > file.sql

Этот экземпляр mysql не имеет пароля root для localhost, поэтому выполнение этой команды от имени root всегда работает. Я не понимаю, что он все еще работает, если я запускаю этот сценарий из командной строки, хотя эта команда вызывается не пользователем root, а пользователем mysql. Журналы db показывают, что подключающийся пользователь по-прежнему «root». В то время как, когда скрипт запускается как задание cron, он терпит неудачу, как и ожидалось, журналы mysql показывают, что подключившимся пользователем был mysql.

Проблема на самом деле может быть воспроизведена так просто:

su mysql -c "mysqldump db_name > file.sql"

неожиданно подключается как пользователь root db, если запускается из командной строки как root и ожидаемо подключается как пользователь mysql db, если запускается как root cron.

Нет матери, которая вызовет команду, если пользователь находится на локальной машине.

Если вы разрешите root-доступ к% @ localhost, вы можете подключиться к серверу mysql с любым пользователем, который у вас есть.

Пример: если вы вошли в систему с пользователем test1, вы все равно можете подключиться к локальному mysql с пользователем root.

user1@machine~$ mysql -h localhost -u root

или

user1@machine~$ mysqldump -h localhost -u root mydatabase > backup.sql

Проверьте свой сценарий резервного копирования, который вы используете. Есть важные вещи.

Если вам нужно запустить сценарий с другим пользователем, вы можете использовать этот пример:

su - user1 -c "/path/scripts/backup.sh"

Причина, по которой вы наблюдаете два разных поведения, заключается в том, что cron не запускается в оболочке, поэтому все переменные среды, к которым у вас есть доступ в оболочке, отсутствуют в cron. Если вы хотите, чтобы cron вел себя так же, как в вашей оболочке, вам нужно вызвать его в оболочке env. Для bash это будет:

/bin/bash -l -c 'your command'