2015-08-06 2 views
1

Я использую phpword, генератор документов ms-слова. Он создает временный файл , после чего он переименовывает его в правильный формат .docx.Разрешение на использование php rename() запрещено с помощью строки exec cmd

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

Не участвует httpd, потому что это вызов приложения TCL с использованием функции exec.

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

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

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

Внимание: переименовать (/ дом/projop/TMP/yRRXn0, Mission Объявление Sheet - BB & T76.docx): Разрешение отказано в/вар /www/html/doc-generate/wwwroot/phpword/src/PhpWord/Template.php на линии 340 Предупреждение: переименовывать

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

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

разрешение /папка TMP:

[[email protected] 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:

[[email protected] 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 

ответ

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

yes, Это сохранит переименованный файл в текущий рабочий каталог PHP. Хороший момент, который я пропустил, +1 – Martin

+0

@mplf спасибо, я пробовал, и он работает хорошо. Я не уверен, почему php не указал на ошибку, что-то вроде «должен указывать папку назначения» или что-то в этом направлении - я потратил часы, пытаясь понять, что не так. Нет, где в Интернете или на веб-сайте php.net не упоминается причина ошибки, вызванная не указанием пути - это должно быть нечто встроенное или иметь правильное сообщение об ошибке. – unixmiah

2

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

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

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

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

Edit:

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

+0

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