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

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

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

Если это помогает:

mysql --version
mysql  Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (x86_64) using readline 5.2

Ответ 1

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

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

Edit:

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

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

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

СТИЛЬНЫЕ ДИРЕКТОРИИ

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

и добавьте

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

и

sudo service mysql restart

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