Отказано в разрешении php rename () с использованием строки exec cmd

1

Я использую phpword, генератор документов ms-word. Он создает временный файл, а затем переименовывает его в правильный формат .docx.

Пользователь projop владеет скриптом php и запускает его как projop.

Существует не какой-либо httpd потому что это вызов из приложения TCL с помощью функции exec.

Я создал папку php temp в /home/projop/tmp и дал 0777 плюс убедиться, что она принадлежит projop:projop.

Должно ли это принадлежать группе root или, возможно, группе apache? Я на CentOS 6.5. не уверен, но я все время отказываюсь от разрешения.

PHP-скрипт Template.php который переименовывает, также принадлежит projop

Предупреждение: rename (/home/projop/tmp/yRRXn0, лист анонса миссии - BB & T76.docx): разрешение отклонено в /var/www/html/doc-generate/wwwroot/phpword/src/PhpWord/Template.php в строке 340 Предупреждение: переименовать

Я не знаю, что случилось. Пользователь, которому принадлежит сценарий, является projop, папка tmp находится в домашнем каталоге пользователя и принадлежит projop.

Я не уверен, что происходит.

Разрешение папки /tmp:

[root@project-open-v40 projop]# ls -la
total 493808
drwxr-xr-x.  7 projop root        4096 Aug  6 09:40 .
drwxr-xr-x.  3 root   root        4096 Jul  9 09:37 ..
drwxrwxr-x.  4 projop projop      4096 Oct 16  2012 acs-bootstrap-installer-master
-rwxr-xr-x.  1 projop projop     27527 Jul 15 10:32 gain_fns.php
-rw-r-----.  1 projop projop      2487 Jul 17 11:49 logo.gif
-rw-rw-r--.  1 projop projop     52535 Jul 23 09:57 master
-rwxr-xr-x.  1 projop projop      3039 Jul 28 14:37 notifyPM.php
-rw-r--r--.  1 projop projop     59719 Aug  5 09:35 resetInvoice.php
drwxr-xr-x.  3 apache apache      4096 Mar 12 15:34 templates
-rw-r--r--.  1 apache projop   7966720 Jul  9 09:37 templates.tar
drwxrwxrwx.  2 projop projop      4096 Aug  6 09:54 tmp
drwxr-xr-x.  6 apache apache      4096 Mar  2 02:43 vendor
-rw-r--r--.  1 apache projop 211886080 Jul  9 09:38 vendor.tar
drwxr-xr-x. 18 apache apache      4096 Jul  7 10:40 wwwroot
-rw-r--r--.  1 apache projop 285624320 Jul  9 09:38 wwwroot.tar

/tmp:

[root@project-open-v40 tmp]# ls -la
total 152
drwxrwxrwx. 2 projop projop  4096 Aug  6 09:54 .
drwxr-xr-x. 7 projop root    4096 Aug  6 09:40 ..
-rwxrwxrwx. 1 projop projop 34854 Aug  6 09:53 G0pC83
-rwxrwxrwx. 1 projop projop 34854 Aug  6 09:42 lLm9Iz
-rwxrwxrwx. 1 projop projop 34854 Aug  6 09:46 NR8CSg
-rwxrwxrwx. 1 projop projop 34854 Aug  6 09:54 yRRXn0
Теги:
file-permissions
centos

2 ответа

2
Лучший ответ

Глядя на предупреждение команды переименования:

Warning: rename(/home/projop/tmp/yRRXn0,Mission Announcement Sheet - BB&T76.docx): Permission denied in /var/www/html/doc-generate/wwwroot/phpword/src/PhpWord/Template.php on line 340 Warning: rename  

вы пытаетесь переименовать файл без указания пути. Затем вы пытаетесь переименовать в другое место из вашего ожидаемого /home/projop/tmp/

Попробуйте предварительно найти путь к второму аргументу и повторите попытку.

  • 0
    да, это сохранит переименованный файл в текущем рабочем каталоге PHP. Хороший момент я пропустил, +1
  • 0
    @mplf спасибо - я попробовал, и это работает хорошо. Я не уверен, почему php не указал на ошибку, что-то вроде «необходимо указать папку назначения» или что-то подобное - я потратил часы, пытаясь выяснить, в чем дело. Где бы в интернете или на сайте php.net не упоминалось, что причина ошибки вызвана не указанием пути - это должно быть что-то встроенное или иметь правильное сообщение об ошибке.
2

используйте chmod для изменения прав доступа к файлу, прежде чем пытаться переименовать его - изменение разрешений на 0777, как у вас есть для папки.

http://php.net/manual/en/function.chmod.php

Также используйте http://php.net/manual/en/function.fileperms.php для возврата текущих значений файла, посмотрите, есть ли там что-то необычное?

Другой альтернативой, если это не удается, является использование скрипта PHP для загрузки содержимого файла, а затем сохранения содержимого под новым именем и удаления оригинала. Это длительный процесс того, что делает переименование. Это не идеальный вариант, а вариант.

Редактировать:

Возможно, вам не удастся переименовать содержимое папки /tmp/, так как это выделенная и указанная временная папка, поэтому вместо ее переименования попробуйте выполнить описанный выше процесс открытия файла, а затем переименуйте и сохраните его на другой более постоянный место назначения.

  • 0
    # Спасибо большое - я сделал это, и это помогло - но проблема заключалась в пути к файлу, я думаю, вам нужен путь от и до - я не понимаю, почему сообщение об ошибке php не может выдать подсказку - взял часы, чтобы понять, но спасибо вам, ребята, за быструю помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню