8

我试图了解在使用 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(本地主机)(用于学习目的)

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

  • MySQL 版本 5.1.63

  • 操作系统 Linux Backtrack 5r3。

我以 root 身份运行该命令。另外,我可以在 /var/www/ 中自由创建文件夹或文件

Errcode 13 我知道这意味着权限被拒绝,但我应该怎么做才能解决这个问题?

任何帮助将不胜感激。

4

7 回答 7

11

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

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

于 2013-01-19T16:37:26.473 回答
6

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

然后您必须重新启动 apparmorsudo /etc/init.d/apparmor restart

于 2013-11-30T16:54:27.157 回答
3

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

这可能不是一种安全的方法,您可能想考虑将文件放在其他地方

于 2013-01-19T16:38:17.880 回答
2

虽然这个帖子很老了,但在 2018 年这个问题仍然存在。我花了几个小时在这个迷宫中敲打我的头。

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

  1. 要允许 MySql 选择 INTO OUTFILE,需要secure-file-priv在配置中设置 MySQL 的选项。将以下 2 行附加到/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并附加以下 2 行——不要忘记结尾的逗号:

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

保存它,然后重新解析:

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

那应该可以。

于 2018-12-13T11:21:43.737 回答
0

在 centos 上,selinux 的表现并不好。

$ getenforce
Enforcing

$ setenforce 0
Permissive

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

于 2015-01-28T22:06:06.653 回答
0

检查 mysqld 的用户,

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

检查wiich group mysql属于with,

groups mysql
mysql : mysql www

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

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

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

于 2019-12-09T11:36:56.473 回答
0

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

secure_file_priv对我来说是新的,但我没有尝试这个,因为我不想重建我的 docker 容器只是为了让它工作。

解决方案

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

解决方法

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

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

好吧,它工作得很好,所以为什么要打扰。

于 2021-01-14T22:42:58.717 回答