touch(): сбой при использовании: операция не разрешена

#php #linux #raspberry-pi #touch #ntfs

#php #linux #raspberry-pi #коснитесь #ntfs

Вопрос:

Я попытался выполнить эту команду:

 php -r "touch('/mnt/my_drive/test.txt', 1600981328);"
  

Я получил эту ошибку:

 PHP Warning:  touch(): Utime failed: Operation not permitted in Command line code on line 1
  

Если я запускаю его с sudo помощью, я не получаю ошибку.

/mnt/my_drive это диск NTFS. Монтирование было создано fsab с umask=000 помощью, поэтому я понятия не имею, почему я получаю ошибку разрешения.

Пожалуйста, не помечайте это как дубликат, потому что подобные вопросы имеют следующие ответы:

  • Проверьте разрешения: это должно быть правильно из-за umask=000
  • Запустите composer / php в расширенном режиме: Я бы хотел избежать запуска веб-сервера от имени администратора
  • Измените некоторые файлы библиотеки в поставщике: я получаю эту ошибку даже в командной строке, как показывает мой пример
  • Не используйте ntfs: это не мой выбор

Комментарии:

1. Можете ли вы показать нам строку монтирования из fstab? Если он работает с использованием sudo, это определенно проблема с разрешениями. Если у вас есть umask определенный в fstab, мой первый вопрос — проверить uid gid , есть ли также определенный и / или?

2. Пожалуйста, добавьте некоторые подробности об используемом сценарии, например, точный дистрибутив и версию Linux, версию PHP и текущие данные монтирования со всеми параметрами / флагами? Спасибо

Ответ №1:

Это может произойти, когда пользователь PHP работает как не является владельцем файлов кэша. Проверьте эту ссылку Сбой Utime: операция не разрешена

Ответ №2:

Ваш код отлично работал на моей машине с php7.4 и ntfs, смонтированной с:

/dev/sdaX в /mnt/tmp введите fuseblk rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)

Вы уверены, что каталог, в котором вы пытаетесь это сделать, позволяет создавать файлы? Существует ли каталог?

Если вы можете создавать обычные файлы без установки параметра time, это может быть как-то связано с монтированием ntfs или fuse.

В этом случае: попробуйте запустить команду php в strace, чтобы увидеть, что на самом деле не удается, это должно помочь устранить ошибку.

РЕДАКТИРОВАТЬ: также umask не должен иметь значения в этом случае, какое значение имеют разрешения каталогов, содержащих файл.

Ответ №3:

Обновление времени изменения файла завершается сбоем, если оно не выдано владельцем. Попробуйте очистить файлы кэша и воссоздать их заново с пользователем PHP в качестве владельца.

Ответ №4:

Никогда не считается хорошим моментом для изменения времени модификации, если только нет необходимости передавать что-то другим. Это поспешно и не показывает никакой функции. Единственное, что я могу вам сказать, это то, что вы должны владеть файлом, вам может понадобиться root, просто для доступа к этим разрешениям, и что с помощью sudo вы можете делать все, что угодно. Так что у вас нет надежды на это. Я надеюсь, что это может заставить вас поверить в какой-то другой способ сбоя файловой системы для ваших клиентов.

Комментарии:

1. Это минимально воспроизводимый пример. Я не хочу вызывать touch таким образом, но библиотека это делает.

2. @IterAtor Вы читали документацию? Обычно он может указывать на какие-либо проблемы в своем собственном коде. Кроме того, если это на GitHub, вы можете быть уверены, что проблема с кодом устранена, и автор кода напрямую позаботится о ней.