【问题标题】:php create_directory Permission denied: when attempting shell_exec scriptphp create_directory 权限被拒绝:尝试 shell_exec 脚本时
【发布时间】:2013-07-08 14:18:54
【问题描述】:

当我尝试shell_exec('/home/user/scripts/./script') 时,我收到以下错误:

terminate called after throwing an instance of 'boost::filesystem3::filesystem_error'
  what():  boost::filesystem::create_directory: Permission denied: "/.script"
Aborted (core dumped)

shell_exec('whoami') 在我面向 Web 的 php 脚本中返回 www-data

目录和文件的权限完全一样:

-rwxrwxr-x 1 user123   group456     8246 Jun 25 06:10 script
drwxrwxr-x 7 user123   group456     4096 Jul 10 14:54 . 

其实我可以shell_exec('touch /home/user/scripts/test'),它会毫无问题地创建文件。

$ ls -l /home/user/scripts/test
-rw-r--r-- 1 www-data www-data          0 Jul 10 14:54 test123

这是我为每个用户设置组的方式:

$ groups user123
user123 : group456
$ groups www-data
www-data : group456

为什么会出现这个错误?

【问题讨论】:

  • 如果你从命令行运行/home/user/scripts/./script会发生什么?
  • 它得到了预期的结果。事实上,我从这个线程中了解到,我也可以使用/home/user/scripts/script 执行命令并且它可以工作。应该注意的是,我正在运行的脚本不是 PHP 脚本,而是一个简短的 C 程序,我在同一台机器上使用面向 Web 的服务器上的 PHP 来调用这个脚本。我使用 PHP 脚本在命令行上以 root 身份调用此 C 脚本没有问题。
  • 当您从 php 运行它时,shell_exec('/home/user/scripts/script')system('/home/user/scripts/script') 的确切错误是什么
  • 我在原始帖子中粘贴的完全相同的错误。如果我在 shell_exec 函数中使用相同的命令并将其粘贴到命令行中,我会得到预期的结果。
  • 我认为您的问题是您的系统正在阻止 apache 获得 root 权限。你有 SELinux 吗?

标签: php apache shell ubuntu permissions


【解决方案1】:

您运行的脚本有错字:它试图在 root 文件夹中创建文件夹 /.script 而不是 ./script(相对路径)。

【讨论】:

  • 不明白,怎么打错字了?我可以使用#!/usr/bin/php从命令行运行这个确切的页面,它工作正常,我通过在命令行中输入./scriptname来运行我的大部分脚本,为什么它在apache上失败但在命令行上没有?
  • 脚本错误消息说它无法创建/.script,这是一个名为.script 的文件夹,位于根文件夹/ 中。 1)您尝试从 PHP 运行的脚本有错字,2)您错误地复制/粘贴了错误消息,或者 3)boost 正在输出不正确的错误消息。在运行命令之前,您始终可以尝试 chdir('/home/user/scripts)` 以确保它使用正确的 PWD。​​span>
  • 没有错别字,我没有复制/粘贴任何错误,我尝试了您的建议:chdir 不起作用,我遇到了与原始帖子中相同的错误。跨度>
  • 更具体地说,在我的 php 页面开头使用以下 chdir 命令:chdir('/home/user/scripts'); 我尝试以下命令:shell_exec('./script') - 导致我的 OP 中出现错误消息。 . shell_exec('script') -- 导致新的错误消息... sh: 1: script: not found... shell_exec('sh script') -- 导致一些奇怪的ELF: not found 和语法错误消息。
  • 这是一个可执行文件还是 shell 脚本,如果您获取可执行文件,您将获得 ELF: not found
【解决方案2】:

您是否尝试在/home/user/scripts/./script 执行脚本,那么您应该以shell_exec('sh /home/user/scripts/script') 的身份运行

当您在路径上添加./ 时,其解释不同。

当你传递./script - 你指的是当前目录中的文件名script

此外,您实际上从您的 c 程序中得到了错误,它告诉我们您的系统正在停止 apache 以获得 root 权限。您可以audit2allow 让 apache 获得所需的权限。

【讨论】:

  • 这很有趣,我没有意识到sh./ 有不同的含义。您能否详细说明这两个命令的区别,因为 AFAIK 几乎不可能搜索像 ./ 这样的术语。无论如何,我仍然遇到一些错误:ELF: not found Syntax error: "(" unexpected cannot create 0?A@ Using shell_exec('sh /home/user/scripts/script')
  • ./filename 表示当前目录下的文件名。
  • 我怎么可能在/home/user2/somedir/altscript.php 中编写一个包含shell_exec('/home/user/scripts/./script') 行的php 脚本并且它可以工作?
  • 其他用户是否有相同的 ini 设置?如果不是,则表明 safe_mode_exec_dir 设置存在问题
  • 安全模式已关闭,据我所知 -- safe_mode = Off 来自 /etc/php5/apache2/php.ini
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2019-02-07
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多