Как я могу сделать так, чтобы MySQL записывал файлы от имени другого пользователя?

Я работаю с запросом MySQL, который пишет в выходной файл. Я запускаю этот запрос один раз в день или два, поэтому я хочу иметь возможность удалить выходной файл, не прибегая к su или sudo. Единственный способ сделать это - записать outfile как принадлежащий кому-то, кроме пользователя mysql. Это возможно?

Редактировать: я не перенаправляю вывод в файл, я использую часть INTO OUTFILE запроса select для вывода в файл.

Если это поможет:

mysql - версия
mysql  Ver 14.12 Distrib 5.0.32, для pc-linux-gnu (x86_64) с использованием readline 5.2

4 ответа

Решение

Выходной файл создается процессом mysqld, а не вашим клиентским процессом. Поэтому выходной файл должен принадлежать uid и gid процесса mysqld.

Вы можете избежать sudo для доступа к файлу, если вы обращаетесь к нему из процесса с помощью uid или gid, который может получить доступ к файлу. Другими словами, если mysqld создает файлы, принадлежащие uid и gid "mysql"/"mysql", то добавьте свою учетную запись в группу "mysql". После этого вы сможете получить доступ к файлу при условии, что режим доступа к файлу включает групповой доступ.

Редактировать:

Вы удаляете файл в /tmp с режимом прав доступа к каталогу rwxrwxrwt. Липкий бит ('t') означает, что вы можете удалять файлы, только если ваш uid совпадает с владельцем файла, независимо от прав доступа к файлу или каталогу.

Если вы сохраните выходной файл в другом каталоге, в котором не установлен бит закрепления, вы сможете нормально удалить этот файл.

Прочитайте этот отрывок из справочной страницы для sticky(8):

Клейкие каталоги

Каталог, для которого установлен "sticky bit", становится каталогом только для добавления или, точнее, каталогом, в котором удаление файлов ограничено. Файл в "липком" каталоге может быть удален или переименован пользователем только в том случае, если пользователь имеет разрешение на запись в каталог, а пользователь является владельцем файла, владельцем каталога или суперпользователем. Эта функция полезна для таких каталогов, как /tmp, которые должны быть общедоступными для записи, но должны лишать пользователей лицензии на произвольное удаление или переименование файлов друг друга.

Не используя синтаксис "SELECT...INTO OUTFILE", нет.

Вам нужно запустить запрос (т. Е. Клиента) от имени другого пользователя и перенаправить вывод. Например, отредактируйте ваш crontab для запуска следующей команды, когда вы хотите:

mysql db_schema -e 'SELECT col,... FROM table' > /tmp/outfile.txt

Это создаст /tmp/outfile.txt в качестве пользователя crontab, к которому вы добавили команду.

Я просто делаю

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

и добавить

 /var/www/codeigniter/assets/download/* w,

а также

sudo service mysql restart

И это все, я могу сделать легко SELECT INTO OUTFILE любое имя файла

Если у вас есть другой пользователь, который запустит запрос из cron, он создаст файл от имени этого пользователя.

Другие вопросы по тегам