php 我如何找出哪个linux用户被用来执行'into outfile'查询?(2台服务器)

6ss1mwsb  于 2022-12-10  发布在  PHP
关注(0)|答案(1)|浏览(117)

我正在laravel中执行一个查询,选择所有产品并将结果放入csv文件中。这在windows上都能正常工作,但在linux上,文件权限阻止了这个操作。
我的查询:

$query = 
<<<END
select * from products
INTO OUTFILE '/var/www/html/storage/feeds/products.csv'
fields TERMINATED BY '~' optionally ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
END

DB::statement($query);

我的错误:
SQL状态[HY 000]:一般错误:1无法创建/写入文件'/var/www/html/storage/feeds/products.csv'
我将www-data用户和组添加到feeds文件夹,该文件夹当前为空。

注:

1.我有一个项目的副本运行在托管数据库的同一台服务器上,在这里我可以只将mysql用户的权限添加到feeds文件夹来解决这个问题。
1.我通过ssh隧道访问数据库,因此在此系统上没有可分配访问权限的mysql用户。
系统上用户的完整列表:

root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
www-data:x:82:82:Linux User,,,:/home/www-data:/sbin/nologin
application:x:1000:1000:Linux User,,,:/home/application:/bin/bash
nginx:x:100:101:nginx:/var/lib/nginx:/sbin/nologin

编辑:我试过在这台机器上安装mysql和mysql-client,所以我有一个mysql用户和组分配到desitnation文件夹,但没有工作。
编辑2:按照@LawrenceCherone的建议,我试着把文件放到一个临时位置来运行查询。这次查询没有崩溃,但是我找不到文件。在重试查询后,它崩溃了,说文件已经存在。我开始在mysql服务器上查找并找到了它。虽然没有解决方案,但它让我们看到了一些正在发生的事情:这个文件不是在我需要它的服务器上创建的,而是在mysql服务器上创建的。

ymdaylpp

ymdaylpp1#

感谢评论者引导我走向解决方案的方向。
由于我很清楚into outfile不会将文件放在客户端,而是放在服务器端,并且下一个目标是将文件从服务器传输到客户端,因此我决定使用here所述的解决方案:
首先,我需要确保mysql-client安装在php服务器上,然后添加以下代码:

$host = config('database.connections.mysql.host');
$port = config('database.connections.mysql.port');
$user = config('database.connections.mysql.username');
$password = config('database.connections.mysql.password');
$database = config('database.connections.mysql.database');
$query = "select * from products";
$pattern = 's/\'/\\\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g';
$filepath = '/var/www/html/storage/feeds/products.csv';
$command = "mysql -h $host -P $port -u $user --password=$password $database -e \"$query\" | sed \"$pattern\" > $filepath";
exec($command);

目录的权限需要是运行php的用户的权限。我在php中做了exec('whoami', $output);var_dump($output);die;来发现这一点。

相关问题