继在学习了在mysql中的secure-file-priv的特性之后,我在学习mysql写文件的时候又遇到了新的问题。

mysql> select '<?php phpinfo();?>' into outfile '/var/www/html/1.php';
ERROR 1 (HY000): Can't create/write to file '/var/www/html/1.php' (Errcode: 13)

在执行上述语句的时候,发生了一个错误,错误代码是13

在ubuntu下,查看错误代码的含义可用perror来查阅。

root@ubuntu:/home/ubuntu/Desktop# perror 13
OS error code  13:  Permission denied

可得知是权限不足。我写入到/tmp目录是没有问题的,我开始觉得提升/var/www/html目录的权限。

chmod 777 /var/www/html

重启mysql,没有效果 – -。

chmod 1777 /var/www/html

重启mysql,仍然没有效果 – -。

已经不是目录权限的问题了,看来是其他原因导致的权限问题。

解决ing –> ubuntu中的apparmor在作怪

关掉apparmor

root@ubuntu:/home/ubuntu/Desktop# service apparmor teardown
 * Unloading AppArmor profiles                                           [ OK ]

写入成功:

mysql> select '<?php phpinfo();?>' into outfile '/var/www/html/1.php';
Query OK, 1 row affected (0.01 sec)

注1:
网上有说是开启了SELINUX的原因,因为我没有开启,所以作罢。
解决方案:

vi /etc/selinux/config
SELINUX=enforcing

SELINUX=enforcing改成SELINUX=disabled

注2:
直接关闭apparmor有点简单粗暴,可以修改/etc/apparmod.d/usr.sbin.mysqld

添加/var/www/html/* rw,单独一条路径,然后重启service apparmor restart

# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>

/usr/sbin/mysqld {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  ...... <略>
  network tcp,

  /var/www/html/* rw,
  /etc/hosts.allow r,
  /etc/hosts.deny r,

  /etc/mysql/*.pem r,
  /etc/mysql/conf.d/ r,
  /etc/mysql/conf.d/* r,
  /etc/mysql/*.cnf r,
  /usr/lib/mysql/plugin/ r,
  /usr/lib/mysql/plugin/*.so* mr,

  ......

  /sys/devices/system/cpu/ r,

  # Site-specific additions and overrides. See local/README for details.
  #include <local/usr.sbin.mysqld>
}