Errcode 13,SELECT INTO OUTFILE问题

时间:2013-01-19 16:31:49

标签: mysql

我试图了解使用INTO OUTFILE命令时遇到问题的原因。

我总是得到这个错误:

ERROR 1 (HY000): Can't create/write to file '/var/www/p1.txt' (Errcode: 13)


SELECT password FROM mysql.user WHERE user='root' INTO OUTFILE '/var/www/p1.txt';

有用的细节:

  • 网络应用程序:DVWA(localhost)(用于学习目的)

  • 服务器:Apache / 2.2.14(Ubuntu) - PHP / 5.3.2

  • MySQL版本5.1.63

  • 操作系统Linux Backtrack 5r3。

我以root身份运行命令。另外,我可以在/ var / www /

中自由创建文件夹或文件

Errcode 13我知道这意味着许可被拒绝,但我该怎么办才能解决问题?

任何帮助都将受到高度赞赏。

7 个答案:

答案 0 :(得分:9)

即使您以root用户身份登录MySQL,文件写入也将作为运行实际MySQL守护程序的用户执行。

换句话说,您应该检查哪个用户运行mysqld,并为该用户的目录授予写入权限。

答案 1 :(得分:6)

您必须更改用户mysqld的权限。首先运行以下命令sudo aa-status以检查用户状态和授权目录。如果要更改权限,请编辑/etc/apparmor.d/usr.sbin.mysqld并插入所需的目录。

然后必须重启apparmor sudo /etc/init.d/apparmor restart

答案 2 :(得分:4)

chown / var / www给试图写文件的用户,或者chmod 777 / var / www

这可能不是一种安全的方式,您可能会考虑将文件放在别处

答案 3 :(得分:0)

在世界上,selinux玩的东西不太好。

$ getenforce
Enforcing

$ setenforce 0
Permissive

现在这很粗糙,但对我有效(直到重启,然后重新开启)。 如果此临时措施有效,您需要谷歌了解如何正确配置selinux。

答案 4 :(得分:0)

尽管这篇文章很老,但在2018年,这个问题仍然存在。我花了几个小时在这个迷宫里ing头。

服务器版本:5.7.24在Ubuntu 14.04上运行的MySQL Community Server(GPL)

  1. 要允许MySql SELECT INTO OUTFILE,需要在配置中设置MySQL的secure-file-priv选项。 将以下两行添加到/etc/mysql/mysql.conf

    [mysqld]
    # allow INTO OUTFILE file and LOAD DATA INFILE to this directory
    secure_file_priv=/usr/share/mysql-files                
    
  2. /usr/share/mysql-files是将存储我的文件的目录。我创建它的目的是

    sudo su
    cd /usr/share
    mkdir mysql-files
    chown mysql:mysql mysql-files
    chmod a+rw mysql-files
    

根据自己的喜好更改/usr/share/mysql-files,但避免使用/tmp目录!

为什么? 因为,下次您将重新引导时,/tmp目录将被愉快地删除,其中包括您宝贵的mysql-files子目录。然后,mysql服务会阻塞,并且无法启动,从而导致密码信息出现严重错误。

  1. 重新启动mysql并检查:

    sudo su
    service mysql restart
    mysql
    mysql> SHOW VARIABLES LIKE "%secure%";
    +--------------------------+-------------------------+
    | Variable_name            | Value                   |
    +--------------------------+-------------------------+
    | require_secure_transport | OFF                     |
    | secure_auth              | ON                      |
    | secure_file_priv         | /usr/share/mysql-files/ |
    +--------------------------+-------------------------+
    3 rows in set (0.07 sec)
    mysql> quit
    Bye
    
  2. 您还还没有完成

有一个名为apparmor的巨魔会破坏您的项目。 编辑文件/etc/apparmor/local/usr/sbin/mysqld并附加 以下两行-不要忘记结尾的逗号:

    /usr/share/mysql-files rw,
    /usr/share/mysql-files/** rw,

保存并重新解析:

sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

应该做到的。

答案 5 :(得分:0)

使用以下命令检查mysqld的用户

ps -aef | grep mysql
mysql     9355  9102  0 Aug24 ?        21:53:25 /usr/libexec/mysqld 

检查wiich组mysql所属,

groups mysql
mysql : mysql www

然后将文件写入属于mysql或具有组www和mysql的写入权限的路径下。例如,test下对www组具有写许可权。

ll /data/
drwxrwxr-x 2 www    www 4096 Dec  9 19:31 test

然后执行mysql mysql -u root -p -e 'use sc_test; select file_path from sc_files INTO OUTFILE "/data/test/paths.txt";'

答案 6 :(得分:0)

我也与这个神秘的错误斗争了几个小时,尝试了我能找到的一切,但无济于事,最后想起我几年前已经遇到过同样的问题,无论我有多久都无法找到解决方案搜索并尝试了所有这些明智的建议。

secure_file_priv 对我来说是新手,但我没有尝试这个,因为我不想为了完成这项工作而重建我的 docker 容器。

解决方案

查看我的 docker-compose 文件,我找到了解决此问题的方法:我没有到目标目录的映射,因此对于 mysql 容器,此目录不存在。

解决方法

当时我为我的 cron 工作开发了一个解决方法:

  1. 首先转储到 tmp(我的容器已映射到该位置)
  2. mv 到它应该放在的地方

好吧,它工作得很好,所以何必呢。