MYSQL 进入输出文件“拒绝访问”-但我的用户具有“全部”访问权限.. 文件夹是 CHMOD 777

Posted

技术标签:

【中文标题】MYSQL 进入输出文件“拒绝访问”-但我的用户具有“全部”访问权限.. 文件夹是 CHMOD 777【英文标题】:MYSQL into outfile "access denied" - but my user has "ALL" access.. and the folder is CHMOD 777 【发布时间】:2011-08-30 18:58:06 【问题描述】:

有什么想法吗?

SELECT * INTO OUTFILE '/home/myacnt/docs/mysqlCSVtest.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '*'
LINES TERMINATED BY '\n'
FROM tbl_property 
WHERE managerGroupID = $managerGroupID

错误:

Access denied for user 'asdfsdf'@'localhost' (using password: YES)

【问题讨论】:

"ALL PRIVILEGES" 不包括所有权限。与这种情况相关,它不包括FILE 特权,这是SELECT INTO OUTFILE 语句所必需的。我在英语和 MySQL 之间的这种不匹配方面遇到了一些麻烦:dba.stackexchange.com/a/96894/53784 如果您随后遇到“MySQL 服务器正在使用 --secure-file-priv 选项运行,因此它无法执行此语句”,请查看:***.com/questions/32737478/… 【参考方案1】:

对于未来的读者,如果他们希望使用 bash 批量导出,一种简单的方法如下,

akshay@ideapad:/tmp$ mysql -u someuser -p test -e "select * from offices"
Enter password: 
+------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+
| officeCode | city          | phone            | addressLine1             | addressLine2 | state      | country   | postalCode | territory |
+------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+
| 1          | San Francisco | +1 650 219 4782  | 100 Market Street        | Suite 300    | CA         | USA       | 94080      | NA        |
| 2          | Boston        | +1 215 837 0825  | 1550 Court Place         | Suite 102    | MA         | USA       | 02107      | NA        |
| 3          | NYC           | +1 212 555 3000  | 523 East 53rd Street     | apt. 5A      | NY         | USA       | 10022      | NA        |
| 4          | Paris         | +33 14 723 4404  | 43 Rue Jouffroy D'abbans | NULL         | NULL       | France    | 75017      | EMEA      |
| 5          | Tokyo         | +81 33 224 5000  | 4-1 Kioicho              | NULL         | Chiyoda-Ku | Japan     | 102-8578   | Japan     |
| 6          | Sydney        | +61 2 9264 2451  | 5-11 Wentworth Avenue    | Floor #2     | NULL       | Australia | NSW 2010   | APAC      |
| 7          | London        | +44 20 7877 2041 | 25 Old Broad Street      | Level 7      | NULL       | UK        | EC2N 1HN   | EMEA      |
+------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+

如果您是由非 root 用户导出,请设置如下权限

root@ideapad:/tmp# mysql -u root -p
MariaDB[(none)]> UPDATE mysql.user SET File_priv = 'Y' WHERE user='someuser' AND host='localhost';

重启或重新加载mysqld

akshay@ideapad:/tmp$ sudo su
root@ideapad:/tmp#  systemctl restart mariadb

示例代码 sn-p

akshay@ideapad:/tmp$ cat test.sh 
#!/usr/bin/env bash

user="someuser"
password="password"
database="test"

mysql -u"$user" -p"$password" "$database" <<EOF
SELECT * 
INTO OUTFILE '/tmp/csvs/offices.csv' 
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n'
FROM offices;
EOF

执行

akshay@ideapad:/tmp$ mkdir -p /tmp/csvs
akshay@ideapad:/tmp$ chmod +x test.sh
akshay@ideapad:/tmp$ ./test.sh 
akshay@ideapad:/tmp$ cat /tmp/csvs/offices.csv 
"1"|"San Francisco"|"+1 650 219 4782"|"100 Market Street"|"Suite 300"|"CA"|"USA"|"94080"|"NA"
"2"|"Boston"|"+1 215 837 0825"|"1550 Court Place"|"Suite 102"|"MA"|"USA"|"02107"|"NA"
"3"|"NYC"|"+1 212 555 3000"|"523 East 53rd Street"|"apt. 5A"|"NY"|"USA"|"10022"|"NA"
"4"|"Paris"|"+33 14 723 4404"|"43 Rue Jouffroy D'abbans"|\N|\N|"France"|"75017"|"EMEA"
"5"|"Tokyo"|"+81 33 224 5000"|"4-1 Kioicho"|\N|"Chiyoda-Ku"|"Japan"|"102-8578"|"Japan"
"6"|"Sydney"|"+61 2 9264 2451"|"5-11 Wentworth Avenue"|"Floor #2"|\N|"Australia"|"NSW 2010"|"APAC"
"7"|"London"|"+44 20 7877 2041"|"25 Old Broad Street"|"Level 7"|\N|"UK"|"EC2N 1HN"|"EMEA"

【讨论】:

【参考方案2】:

我尝试了所有解决方案,但仍然不够。经过一番挖掘,我最终发现我还必须设置“file_priv”标志,然后重新启动 mysql。

继续:

授予权限:

> GRANT ALL PRIVILEGES
  ON my_database.* 
  to 'my_user'@'localhost';

> GRANT FILE ON *.* TO my_user;

> FLUSH PRIVILEGES; 

设置标志:

> UPDATE mysql.user SET File_priv = 'Y' WHERE user='my_user' AND host='localhost';

最后重启mysql服务器:

$ sudo service mysql restart

之后,我可以写入secure_file_priv 目录。对我来说是 /var/lib/mysql-files/,但你可以使用以下命令检查它:

> SHOW VARIABLES LIKE "secure_file_priv";

【讨论】:

【参考方案3】:

由于 cP/WHM 取消了在 phpMyAdmin 中以 root 身份修改用户权限的功能,因此您必须使用命令行:

mysql>  GRANT FILE ON *.* TO 'user'@'localhost';

第 2 步是允许该用户将文件转储到特定文件夹中。有几种方法可以做到这一点,但我最终将文件夹放入:

/home/user/tmp/db

chown mysql:mysql /home/user/tmp/db

这允许mysql用户写入文件。正如之前的海报所说,您也可以使用 MySQL 临时文件夹,我认为这并不重要,但您绝对不想让它成为 0777 权限(世界可写),除非您希望世界看到您的数据。如果您想冲洗重复该过程,则存在潜在问题,因为如果文件存在,INTO OUTFILE 将不起作用。如果您的文件归其他用户所有,那么仅尝试 unlink($file) 将不起作用。如果你和我一样(偏执于 0777),那么你可以使用以下方法设置目标目录:

chmod($dir,0777)

就在执行 SQL 命令之前,然后

chmod($dir,0755)

紧接着,unlink(file) 删除文件。这使它在您的网络用户下运行,无需调用 mysql 用户。

【讨论】:

【参考方案4】:

正如@fijaaron 所说,

    GRANT ALL 并不暗示 GRANT FILE GRANT FILE 仅适用于 *.*

也是这样

GRANT FILE ON *.* TO user;

【讨论】:

【参考方案5】:

尝试执行这条 SQL 命令:

> grant all privileges 
  on YOUR_DATABASE.* 
  to 'asdfsdf'@'localhost' 
  identified by 'your_password';
> flush privileges; 

您似乎在连接数据库时遇到问题,而不是写入您提到的文件夹。

另外,请确保您已将FILE 授予用户'asdfsdf'@'localhost'

> GRANT FILE ON *.* TO 'asdfsdf'@'localhost';

【讨论】:

@Shackrock:查看更新的答案。确保您已将FILE 授予用户。 这里有两个问题。 1) GRANT ALL 不做 GRANT FILE。 2) GRANT FILE 仅适用于 *.* (即全局)。两者都是 MySQL 中的错误。 仅供参考,在执行此操作之前请仔细考虑您不是数据库管理员。我很不高兴发现我改变了特权(“Nooooooo!”)。 :-) 似乎它在写入文件系统中除 /var/lib/mysql 以外的位置时也存在问题,这似乎与文档相反。即使目标文件夹归 mysql:mysql 所有并且每个人都有 rwx 权限和/或使用 sudo 调用...(来自 Ubuntu 此处) 你不需要在GRANT之后使用FLUSH PRIVILEGES。仅当您使用 SQL 而不是使用GRANT 修改权限表时才需要这样做。【参考方案6】:

老实说,我没有费心去处理赠款问题,即使没有特权也可以:

echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt

【讨论】:

那是因为您只是在执行常规 SELECT,而不是 SELECT INTO OUTFILE(在这种情况下为 .csv 文件)。 这对于较大的表来说是一种不好的方法,因为客户端会在将任何内容放入文件之前缓冲整个结果集。 MySQL 将使用这种方法对文件进行制表符分隔,非常完美。在尝试了十几个文件权限、MySQL 设置和各种授权之后,所有这些都跨越了 5 或 6 个不同的帮助页面,这很有效。免得自己头疼,使用它。 在使用此方法之前不要忘记切换到相应的代码页,例如如果导出的数据中有特殊字符,则为“chcp 1252”或“chcp 65001”。 这是迄今为止最实用的答案,其他人非常依赖特权,不是每个人都可以控制

以上是关于MYSQL 进入输出文件“拒绝访问”-但我的用户具有“全部”访问权限.. 文件夹是 CHMOD 777的主要内容,如果未能解决你的问题,请参考以下文章

用户''@ localhost'拒绝访问。试图插入数据PHP Mysql [重复]

对文件的查询输出给出拒绝访问错误

Python Anywhere 拒绝访问 MySQL 数据库

通过 cPanel 创建的 MySql 用户在尝试登录时被“拒绝访问”

React Native,Android Studio,JDBC,MySql - 拒绝访问用户'root'@'ipaddress'

文件拒绝访问