Пользователь не может коснуться-t

Системный вызов mkdir() является атомарным в файловых системах POSIX. Так, использование mkdir команда таким способом, к которому это включает точно один вызов mkdir() достиг бы Вашей цели. (IOW, не использовать mkdir -p). Соответствие разблокировало, rmdir конечно.

Принцип "качество на риск покупателя": mkdir() не могло бы быть атомарным в сетевых файловых системах.

10
15.06.2011, 15:11
2 ответа

Почему это не работает

Когда Вы пытаетесь изменить время изменения файла с touch, или в более общем плане с базовым системным вызовом utime, существует два случая.

  • Вы пытаетесь установить время изменения файла на определенное время. Это требует, чтобы Вы были владельцем файла. (С технической точки зрения эффективный идентификатор пользователя процесса должен быть владельцем файла. ²)
  • Вы пытаетесь установить время изменения файла на текущее время. Это работает, если и только если у Вас есть разрешение записать в файл. Причина этого исключения состоит в том, что Вы могли достигнуть того же эффекта так или иначе путем перезаписи существующего байта файла с тем же значением ¹.

Почему это обычно не имеет значения

  • При копировании файлов с ftp, scp, rsync, и т.д., копия создает новый файл, это принадлежит тому, кто бы ни сделал копию. Таким образом, копировальное устройство имеет разрешение установить времена файла.
  • С rsync Вы не сможете установить время существующих каталогов: они будут установлены на время, когда файл в последний раз синхронизировался в них. В большинстве случаев это не имеет значения. Можно сказать rsync не беспокоиться временами каталога путем передачи --omit-dir-times (-O).
  • С системами управления версиями даты пересмотра хранятся в файлах; метаданные по файлам главным образом не важны.

Решения

Это все имеет отношение к включению разработки PHP в сценарии единственного разработчика (т.е.: без SCM).

Хорошо, остановитесь тут же. Просто, потому что существует единственный разработчик, не означает, что Вы не должны использовать SCM. Необходимо использовать SCM. Сделайте, чтобы разработчик зарегистрировался в файле и дал ему способ нажать “развернуть” кнопку для проверки файлов от SCM в живой каталог.

Нет абсолютно никакой технической причины, почему Вы не должны использовать SCM, но может быть человеческая причина. Если человек, работающий над этими файлами, разрабатывает себя “разработчик”, он должен использовать SCM. Но если это - нетехнический человек, продвигающий документы в, SCM мог бы быть слишком сложным. Поэтому продолжите продвигать файлы по FTP или SSH. Существует три способа, которыми это может работать.

  • Необходимо ли действительно синхронизировать времена? Как обозначено выше, rsync имеет опцию не синхронизировать времена. Scp не делает, если Вы не говорите его. Я не знаю WinSCP, но он, вероятно, может также.
  • Продолжите делать то, что Вы делаете, просто игнорируете сообщения во времена. Файлы все еще копируются. Это не хороший вариант, потому что игнорирование ошибок всегда опасно. Но это технически возможно.
  • Если Вам нужна гибкость в заполнении файлов, принадлежавших apache пользователь, затем обычный подход должен был бы предоставить пользователю доступ SSH как apache. Свободный доступ должен сделать, чтобы пользователь создал закрытый ключ SSH и добавил соответствующий открытый ключ к ~apache/.ssh/authorized_keys. Это означает, что пользователь сможет выполнить произвольные команды как apache пользователь. Так как Вы соглашаетесь с предоставлением пользователя sudo права так или иначе, оно не имеет значения в Вашем случае. Это возможно, но не так легко, для помещения большего количества ограничений (Вам нужна запись базы данных отдельного пользователя с другим именем, тем же идентификатором пользователя, ограниченной оболочкой и chroot тюрьмой; детали в отдельном вопросе, хотя это может уже быть покрыто на этом сайте или на Отказе сервера).

¹ Или, для пустого файла, пишут байт и затем усекают.
² Запрет дополнительных сложностей, но ни один, о чем я знаю, не применяется здесь.

10
27.01.2020, 20:02
  • 1
    Спасибо Gilles, для интересного объяснения. Я не уверен, сколько еще очищаются, я могу быть о варианте использования как бы то ни было. NetBeans продолжает бросать, "не может разъединить" ошибки каждый раз, когда я синхронизирую (хотя файл передается правильно и проверяется на сервере); WinSCP бросает 'время набора: операция, не разрешенная' ошибки; когда я untar файл я заставляю предупреждения о неспособном устанавливать метку времени на время в будущем. Кроме того я не знаю, где проблема находится. Я просто хочу смочь синхронизировать локальное для удаленного dir через SCP/FTP, и проблема, кажется, метки времени. Это помогает?Наверное, нет. –  Tom Auger 15.06.2011, 19:49
  • 2
    @Tom: Я все еще не понимаю, почему Вы не можете только сделать, чтобы пользователи владели файлами. –  Gilles 'SO- stop being evil' 15.06.2011, 20:14
  • 3
    Некоторые файлы должны принадлежать Apache (например, каталог загрузок), таким образом, у меня не может быть изменяемого владельца, просто потому что кто-то работает над некоторыми файлами в каталоге. То, что Вы говорите, не имеет смысла - когда я перезаписываю файл с помощью FTP, владелец не обязательно изменяется. Я не вижу потребность изменить это поведение. –  Tom Auger 15.06.2011, 22:10
  • 4
    @Tom: владелец не изменяется только потому, что это существующие файлы. Я не понимаю, почему Вы не позволяете пользователям загрузить файлы как apache — затем они смогли бы установить времена. См. мой пересмотренный ответ для правильного решения и нескольких субоптимальных. –  Gilles 'SO- stop being evil' 16.06.2011, 10:26
  • 5
    Спасибо за то, чтобы придерживаться этого вопроса Gilles. Используя SVN или некоторый вариант является субоптимальным от ракурса разработки. Любой, который сделал веб-разработку удаленно, может сказать Вам, что процесс является обычно микровозрастающим - особенно при визуальном моделировании - таким образом, Вы делаете фиксации о каждых 30-60 секундах. Если необходимо постоянно выходить IDE, выполнить фиксацию и затем предварительно просмотреть браузер, Вы добавляете тонну издержек к тому, что должно быть простым процессом. SVN только имеет смысл в контексте, когда несколько devs работают над той же частью сайта. Это отличается от программирования. –  Tom Auger 16.06.2011, 16:23

Можно установить rsync для использования sudo на удаленном конце как это:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
2
27.01.2020, 20:02
  • 1
    Чем sudo управлял бы быть? Просто разрешение rsync позволило бы пользователю перезаписывать произвольные файлы. Довольно трудно разобраться в ограничениях аргумента, и так или иначе здесь я думаю, что необходимо было бы поместить ограничения на вход rsync, который технически возможен со сценарием обертки, но не легок. –  Gilles 'SO- stop being evil' 15.06.2011, 11:44
  • 2
    Вы правы, позволяя sudo rsync является очень трудным ограничить. Я только предложил это, потому что OP сказал, что у пользователя уже был sudo доступ. –  Caleb 15.06.2011, 12:29
  • 3
    Спасибо - это интересно, хотя разработчик находится на поле Windows, таким образом, я не уверен, что rsync является лучшим способом пойти. Снова, как я упомянул в редактировании своему сообщению, я хочу это решение работать на любого среднего пользователя, не некоторых priviledged пользователей, вне кого-то принадлежащего группе, которая владеет тем конкретным каталогом. –  Tom Auger 15.06.2011, 15:13
  • 4
    , который я думаю следующая вещь изучить, настраивает ACLs (Списки управления доступом), но у меня есть небольшой опыт в этой области поэтому, возможно, некоторый гуру может добавить ответ и объяснить, если и как это может быть сделано. –  Caleb 15.06.2011, 15:30

Теги

Похожие вопросы