我正在处理写入outfile的MySQL查询。我每天或每两天运行一次这样的查询,所以我希望能够删除outfile而不必诉诸su或sudo。我能想到实现这一目标的唯一方法是将outfile编写为由mysql用户以外的其他人拥有。这可能吗?
编辑:我没有将输出重定向到文件,我使用选择查询的INTO OUTFILE部分输出到文件。
如果有帮助:
mysql --version mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (x86_64) using readline 5.2
答案 0 :(得分:11)
输出文件由mysqld进程创建,而不是由客户端进程创建。因此,输出文件必须由mysqld进程的uid和gid拥有。
如果您从可以访问该文件的uid或gid下的进程访问该文件,则可以避免使用sudo来访问该文件。换句话说,如果mysqld创建由uid和gid“mysql”/“mysql”拥有的文件,那么将您自己的帐户添加到组“mysql”。然后,您应该能够访问该文件,前提是文件的权限模式包括组访问权限。
修改强>
您正在使用目录权限模式rwxrwxrwt删除/ tmp中的文件。粘滞位('t')表示只有当您的uid与文件所有者相同时才能删除文件,无论文件或目录的权限如何。
如果将输出文件保存在另一个没有设置粘滞位的目录中,则应该可以正常删除该文件。
阅读关于sticky(8)的手册页的摘录:
STICKY DIRECTORIES
设置了“粘滞位”的目录将成为仅附加目录,或者更确切地说,是一个限制文件删除的目录。如果用户具有该目录的写入权限,并且该用户是该文件的所有者,该目录的所有者或超级用户,则只有用户才能删除或重命名粘性目录中的文件。此功能非常适用于/ tmp等目录,这些目录必须是可公开写入的,但应拒绝用户任意删除或重命名彼此文件的许可。
答案 1 :(得分:5)
不使用“SELECT ... INTO OUTFILE”语法,编号
您需要以另一个用户身份运行查询(即客户端),并重定向输出。例如,编辑crontab以在需要时运行以下命令:
mysql db_schema -e 'SELECT col,... FROM table' > /tmp/outfile.txt
这会创建/tmp/outfile.txt作为你已经添加命令的crontab的用户。
答案 2 :(得分:1)
如果您有其他用户从cron运行查询,它将以该用户身份创建该文件。
答案 3 :(得分:1)
我只是做
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
并添加
/var/www/codeigniter/assets/download/* w,
和
sudo service mysql restart
就是这样,我可以轻松地SELECT INTO OUTFILE
任何文件名