Php 文件内容返回正常,但未创建任何文件
我正在尝试写入Php 文件内容返回正常,但未创建任何文件,php,file-put-contents,Php,File Put Contents,我正在尝试写入/tmp目录中的一个文件,该目录具有以下权限:drwxrwt。当我从php-a交互式shell执行file\u put\u contents时,它工作正常,并使用提供的内容创建一个文件。在代码中调用此函数时,它返回写入文件的字节数,但在目标目录中未创建任何文件。php和/或apache2日志中没有抛出任何错误 正在代码中进行以下调用 // both $k and $version are defined and have values file_put_contents('/tmp
/tmp
目录中的一个文件,该目录具有以下权限:drwxrwt
。当我从php-a
交互式shell执行file\u put\u contents
时,它工作正常,并使用提供的内容创建一个文件。在代码中调用此函数时,它返回写入文件的字节数,但在目标目录中未创建任何文件。php和/或apache2日志中没有抛出任何错误
正在代码中进行以下调用
// both $k and $version are defined and have values
file_put_contents('/tmp/' . $k . '-version.php', '<?php $version = "' . $version . '";');
Shell命令执行
在代码中添加了shell命令以查看输出:
代码:echo shell_exec('ls/tmp')代码>
输出
fullpagewidgetnew-version.php
在调用之后执行ls/tmp时,我得到了几个由其他进程创建的其他文件,但它没有我通过代码创建的文件
mongodb-27017.sock symlink-dummy systemd-private-64efbd330d8d4df09fc1634371bee3d5-nagios-nrpe-server.service-ZRy81Y tmp.XwUT7dI5RP
sigdump-1018.log systemd-private-64efbd330d8d4df09fc1634371bee3d5-apache2.service-aWwjlA systemd-private-64efbd330d8d4df09fc1634371bee3d5-systemd-resolved.service-wDp3ys
sigdump-1023.log systemd-private-64efbd330d8d4df09fc1634371bee3d5-do-agent.service-u4rdtA systemd-private-64efbd330d8d4df09fc1634371bee3d5-systemd-timesyncd.service-IRGXmZ
stat
命令执行
代码:echo shell_exec('ls/tmp')代码>
输出:
string(34) "/tmp/fullpagewidgetnew-version.php"
bool(true)
bool(true)
bool(true)
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 1508 Links: 2
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-11-01 13:26:33.766987581 +0000
Modify: 2020-11-01 07:00:03.958583691 +0000
Change: 2020-11-01 07:00:03.958583691 +0000
Birth: -
File: /
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 2 Links: 23
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-10-31 18:09:33.585968968 +0000
Modify: 2020-10-21 15:39:29.371174584 +0000
Change: 2020-10-21 15:39:29.371174584 +0000
Birth: -
直接shell执行stat/tmp
:
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 4037 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-11-01 18:04:39.853667091 +0000
Modify: 2020-11-01 18:01:39.463721617 +0000
Change: 2020-11-01 18:01:39.463721617 +0000
Birth: -
File: /
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 2 Links: 23
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-10-31 18:09:33.585968968 +0000
Modify: 2020-10-21 15:39:29.371174584 +0000
Change: 2020-10-21 15:39:29.371174584 +0000
Birth: -
Code:echo shell_exec('ls/')代码>
输出:
string(34) "/tmp/fullpagewidgetnew-version.php"
bool(true)
bool(true)
bool(true)
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 1508 Links: 2
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-11-01 13:26:33.766987581 +0000
Modify: 2020-11-01 07:00:03.958583691 +0000
Change: 2020-11-01 07:00:03.958583691 +0000
Birth: -
File: /
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 2 Links: 23
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-10-31 18:09:33.585968968 +0000
Modify: 2020-10-21 15:39:29.371174584 +0000
Change: 2020-10-21 15:39:29.371174584 +0000
Birth: -
直接shell执行stat/
:
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 4037 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-11-01 18:04:39.853667091 +0000
Modify: 2020-11-01 18:01:39.463721617 +0000
Change: 2020-11-01 18:01:39.463721617 +0000
Birth: -
File: /
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 2 Links: 23
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-10-31 18:09:33.585968968 +0000
Modify: 2020-10-21 15:39:29.371174584 +0000
Change: 2020-10-21 15:39:29.371174584 +0000
Birth: -
解决方案
事实证明,在apache的systemd脚本中,PrivateTmp=true
。这是在tmp目录中创建一个单独的tmp目录
我无法回答该问题,因为它被锁定,这就是为什么在问题中发布解决方案的原因。请将目标文件名保存在变量中,例如
$path
。然后在文件\u put\u contents()
调用中使用它,然后添加函数调用var\u dump($path,file\u exists($path),is\u file($path),is\u writable($path))代码>在调用文件\u put\u contents()之后。然后,您的问题将包含新的源代码,并将得到的输出添加到问题中。@Progman更新了question@SaqibAhmed因此,路径是存在的,它是一个文件,甚至是可写的,这都是预期的。当你看到它实际存在时,为什么你认为它不存在?@SaqibAhmed请回答你的问题,包括如何执行php脚本以及如何运行ls/tmp
命令。甚至添加一个shell_exec('ls/tmp')代码>到您的php脚本。将php脚本和ls
命令的输出都包含到问题中,这两个命令都来自shell\u exec()
行以及命令行。@Progman我已经提供了调试详细信息。你能把这个问题标出来吗?