如何让 MySQL 以不同的用户身份写入输出文件?

Posted

技术标签:

【中文标题】如何让 MySQL 以不同的用户身份写入输出文件?【英文标题】:How can I have MySQL write outfiles as a different user? 【发布时间】:2010-09-18 21:55:04 【问题描述】:

我正在处理写入输出文件的 mysql 查询。我每隔一两天运行一次此查询,因此我希望能够删除输出文件而不必求助于 su 或 sudo。我能想到的唯一方法是让输出文件由 mysql 用户以外的人拥有。这可能吗?

编辑:我没有将输出重定向到文件,我正在使用选择查询的 INTO OUTFILE 部分输出到文件。

如果有帮助:

mysql --版本 mysql Ver 14.12 Distrib 5.0.32,适用于使用 readline 5.2 的 pc-linux-gnu (x86_64)

【问题讨论】:

【参考方案1】:

输出文件由 mysqld 进程创建,而不是由您的客户端进程创建。因此输出文件必须归mysqld进程的uid和gid所有。

如果您从可以访问该文件的 uid 或 gid 下的进程访问该文件,则可以避免使用 sudo 访问该文件。换句话说,如果mysqld创建了uid和gid“mysql”/“mysql”拥有的文件,那么将你自己的帐户添加到组“mysql”中。那么您应该可以访问该文件,前提是该文件的权限模式包括组访问。

编辑:

您正在删除 /tmp 中的文件,目录权限模式为 rwxrwxrwt。粘性位 ('t') 表示只有当您的 uid 与文件所有者相同时才能删除文件,而不管文件或目录的权限如何。

如果您将输出文件保存在另一个没有设置粘性位的目录中,您应该可以正常删除该文件。

阅读sticky(8)手册页的摘录:

粘性目录

设置了 `sticky bit' 的目录变成了只能追加的目录,或者更准确地说,是一个限制删除文件的目录。只有当用户具有目录的写权限并且用户是文件的所有者、目录的所有者或超级用户时,用户才能删除或重命名粘性目录中的文件。此功能适用于 /tmp 等目录,该目录必须可公开写入,但应拒绝用户任意删除或重命名彼此文件的许可。

【讨论】:

文件归“mysql”/“mysql”所有,修改为666。我已将自己添加到mysql组,但仍然无法删除。 文件所在目录的所有权和权限是什么? 认为 Bill 的意思是,您必须对包含的目录具有写权限才能在 UNIX 中删除文件(b/c 它会更新目录列表)。所以“chgrp mysql”目录和“chmod ug+rwX”它给你的mysql-group用户在目录上写权限。 是的,这就是我的意思。 我正在将文件写入 /tmp。 “drwxrwxrwt”根/根【参考方案2】:

不使用“SELECT...INTO OUTFILE”语法,不。

您需要以另一个用户身份运行查询(即客户端),并重定向输出。例如,编辑您的 crontab 以随时运行以下命令:

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

这将创建 /tmp/outfile.txt 作为您已将命令添加到的 crontab 用户。

【讨论】:

请注意,与into outfile 相比,管道会产生不同的结果。例如管道包括列名作为第一行,NULL 而不是 \N 等(在 Ubuntu 中。细节可能在其他操作系统中有所不同)【参考方案3】:

如果您有另一个用户从 cron 运行查询,它将以该用户的身份创建文件。

【讨论】:

【参考方案4】:

我只是这样做

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

并添加

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

sudo service mysql restart

就是这样,我可以轻松地SELECT INTO OUTFILE 任何文件名

【讨论】:

以上是关于如何让 MySQL 以不同的用户身份写入输出文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何以不同用户和管理员身份从命令提示符运行程序 [关闭]

如何以不同的用户身份执行 svn commit?

以不同用户身份运行代码以获得提升的权限

在 Java 中使用 Selenium Webdriver 以不同用户身份运行 IE

如何防止 git 更改文件所有权

以不同用户身份运行应用程序