我试图了解使用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我知道这意味着许可被拒绝,但我该怎么办才能解决问题?
任何帮助都将受到高度赞赏。
答案 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)
要允许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
/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服务会阻塞,并且无法启动,从而导致密码信息出现严重错误。
重新启动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
您还还没有完成!
有一个名为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
工作开发了一个解决方法:
好吧,它工作得很好,所以何必呢。