如何使用 SELECT INTO OUTFILE 写入 /tmp 以外的目录?

Posted

技术标签:

【中文标题】如何使用 SELECT INTO OUTFILE 写入 /tmp 以外的目录?【英文标题】:How to use SELECT INTO OUTFILE to write to a directory other than /tmp? 【发布时间】:2013-12-27 02:18:04 【问题描述】:

我正在尝试使用 SELECT INTO OUTFILE 将文件写入另一个目录中的自定义目录,该目录比我的文档根目录高一级。我可以写信到 /tmp,所以我知道其他一切都在工作。

我正在使用文件的绝对完整路径。我可以使用 php 创建目录并 chmod 到 0777。目录创建成功,模式设置正确(通过SSH和FTP查看)。

我要使用的路径示例:

/var/www/vhosts/mysite/private_www/data_export/newdir/

我原以为只要目录是世界可读/可写/可执行的,mysql 就可以对其进行写入。但我仍然收到此错误。

无法创建/写入文件(错误代码:13)

我发现了很多关于这个错误的帖子,但除了写入/tmp之外没有其他解决方案。但是,如果我写入 /tmp,我必须添加更多代码来处理文件名,然后将文件复制到我想要的位置。

我认为也许我需要一条不同于 PHP 的 MySQL 路径。有没有办法检查 MySQL 将什么视为服务器根目录?但是,我不确定这可能是问题所在,因为我可以使用相同的路径加载 DATA INFILE。

我的设置

CentOS 6 PHP 5.3 MySQL 5.5 带有 Plesk 控制面板的专用服务器 PHP 作为 Apache 模块运行

我错过了什么?

【问题讨论】:

嗯 CentOS。我感觉这是由于启用了 SELinux。检查/sbin/getenforce。它是强制的还是允许的?如果强制执行,我敢打赌 mysqld 被拒绝写入您想要写入的任何位置。 如果我在命令提示符下只输入getenforce,输出就是单词Disabled 好吧,如果 SELinux 处于禁用模式,它不会阻止写入(即使您有 0777 也可能发生) 【参考方案1】:

虽然您已正确设置目标目录的可写权限,但为了让用户将目录树遍历到该目标目录,您必须为该用户在每个更高的目录上提供执行权限进入你的目标目录。这是因为在目录上下文中,执行实际上意味着查看内部以列出内容

这意味着路径中每个目录的最小值(忽略所有者/组权限)

/var/www/vhosts/mysite/private_www/data_export

将是0751,其中最后的1 是“其他”用户类别的执行权限。因此,请验证目标路径中的每个目录是否至少具有 MySQL 服务器用户的执行权限(在 CentOS 系统中可能为 mysql)。

允许在所有这些目录上执行(列表内容)确实意味着任何系统用户都可以检查它们,而不仅仅是 MySQL 用户。在决定最终路径的位置时请考虑这一点。如果可以,您可能希望将其与 www 文件分开。

在您的设置中,您已将目标目录设置为0777,世界可读,世界可写。如果可以避免,那是不可取的。由于 MySQL 能够写入它是真正必要的,因此请考虑将其组所有权更改为 mysql 组。这将使您能够避免使其世界可写。

# Give group ownership to mysql
chown :mysql /var/www/vhosts/mysite/private_www/data_export/newdir
# And just make it writable by the group, not everyone
chmod 0770 /var/www/vhosts/mysite/private_www/data_export/newdir

【讨论】:

指出使用 0777 的安全问题很好。但由于这是在专用服务器上,所有用户都是受信任的用户,我不太关心制作目录世界可写。我喜欢它是世界可写的,所以我可以用 PHP(apache 用户)、MySQl(mysql 用户)和 FTP(我的用户)来写它。 即使在专用服务器上,也可能发生意想不到的事情。我指出这一点,只是作为一个警告。我会认为 apache 用户是非常不可信,并且考虑到我多年来在 PHP 代码中看到的路径遍历漏洞的数量,777 给了我荨麻疹 :)

以上是关于如何使用 SELECT INTO OUTFILE 写入 /tmp 以外的目录?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL SELECT INTO OUTFILE 到不同的服务器?

Mysql select into outfile 命令

MySQL 如何使用 INTO OUTFILE 附加到文件?

Mysql 使用 select into outfile

select into outfile

select into outfile