programing

MYSQL에서 outfile "access denied"로 변환 - 그러나 내 사용자는 "ALL"로 액세스할 수 있습니다.그리고 폴더는 CHMOD 777 입니다.

coolbiz 2022. 11. 23. 21:06
반응형

MYSQL에서 outfile "access denied"로 변환 - 그러나 내 사용자는 "ALL"로 액세스할 수 있습니다.그리고 폴더는 CHMOD 777 입니다.

좋은 생각 있어요?

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)

다음 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';

솔직히 나는 보조금에 대해 신경 쓰지 않았고 이것은 특권이 없어도 효과가 있었다.

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

@fijaaron의 말처럼

  1. GRANT ALL를 의미하지 않습니다.GRANT FILE
  2. GRANT FILE와만 연동되다*.*

역시 그렇다

GRANT FILE ON *.* TO user;

cP/WHM에 의해 PHPyAdmin의 루트로 사용자 특권을 변경하는 기능이 상실되었기 때문에 명령줄을 사용하여 다음 작업을 수행해야 합니다.

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

2단계는 사용자가 특정 폴더에 파일을 덤프할 수 있도록 하는 것입니다.몇 가지 방법이 있는데, 결국에 폴더를 넣게 되었습니다.

/home/user/tmp/db

그리고.

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

그러면 mysql 사용자가 파일을 쓸 수 있습니다.이전 포스터에서 언급했듯이 MySQL temp 폴더도 사용할 수 있습니다.그것은 그다지 중요하지 않다고 생각합니다만, 데이터가 세상에 공개되는 것을 원하지 않는 한, 0777 permission(world-writeable)으로 하고 싶지 않습니다.다음과 같이 프로세스를 헹구고 반복하는 경우 문제가 발생할 수 있습니다.INTO OUTFILE파일이 존재하면 동작하지 않습니다.다른 사용자가 파일을 소유하고 있는 경우unlink($file)작동하지 않습니다.저와 같은 경우(약 0777에 대한 패러노이드) 다음을 사용하여 대상 디렉토리를 설정할 수 있습니다.

chmod($dir,0777)

SQL 명령어를 실행하기 직전에,

chmod($dir,0755)

직후에 이어서unlink(file)파일을 삭제합니다.이렇게 하면 웹 사용자로 모든 것이 실행되며 mysql 사용자를 호출할 필요가 없습니다.

나는 모든 해결책을 시도해 보았지만 여전히 충분하지 않았다.좀 더 자세히 알아보니 결국 '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";

미래의 독자들에게 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@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

샘플 코드 스니펫

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"

언급URL : https://stackoverflow.com/questions/6091427/mysql-into-outfile-access-denied-but-my-user-has-all-access-and-the-fold

반응형