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

Я работаю с запросом MySQL, который записывает в выходной файл. Я запускаю этот запрос один раз в день или два, поэтому я хочу иметь возможность удалить выходной файл, не прибегая к 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

Ответы [ 4 ]

11 голосов
/ 24 октября 2008

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

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

Edit:

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

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

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

КЛЕЙКИЕ КАТАЛОГИ

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

5 голосов
/ 24 октября 2008

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

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

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

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

1 голос
/ 12 июня 2010

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

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

и добавьте

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

и

sudo service mysql restart

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

1 голос
/ 24 октября 2008

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

...