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

10

Когда SCP обращается к моему серверу Fedora, пользователь продолжает получать ошибки о невозможности изменить временные метки файла («установить время: операция не разрешена»). Пользователь не является владельцем файла, но мы не можем chownфайлы этому пользователю по соображениям безопасности. Пользователь может sudo, но так как это происходит через SCP / FTP-клиент, это также невозможно сделать. И, наконец, мы не хотим предоставлять этому пользователю root-доступ, просто чтобы позволить ему использовать синхронизацию, такую ​​как rsync или WinSCP, которая должна устанавливать временные метки.

Пользователь является частью группы с полными rwразрешениями на все соответствующие файлы и каталоги. Любые мысли о том, как предоставить пользователю разрешение на touch -tэти конкретные файлы, не chownотправляя их ему?

Дополнительная информация Все это связано с включением разработки PHP в сценарии с одним разработчиком (т.е. без SCM). Я пытаюсь работать с Eclipse или NetBeans для работы с локальной копией сайта на основе PHP (WordPress), в то же время позволяя пользователю «мгновенно» просматривать свои изменения на сервере разработки. Пользователь будет работать удаленно. Пока что все попытки автоматической синхронизации потерпели неудачу - даже с использованием WinSCP в режиме «просмотра папки», где он отслеживает локальную папку и пытается выгрузить любые изменения до ошибки удаленного каталога, потому что он всегда пытается установить дату / время ,

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

Меня поражает то, сколько у меня трудностей. Все эти программы (NetBeans, Eclipse, WinSCP) предназначены для синхронизации, и все они пытаются записать метку времени. Так что это должно быть возможно. WinSCP имеет возможность отключить «установить метку времени», но эта опция становится недоступной (всегда «включена»), когда вы выбираете папку мониторинга / синхронизации. Таким образом , это есть , чтобы быть что - то , что является довольно стандартным.

Учитывая, что я полный идиот, когда речь заходит о Linux, и я являюсь "администратором сервера", я могу только предполагать, что это что-то идиотское, что я делаю или что я (неправильно) настроен.

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

Том Оже
источник
1
Ваша файловая система смонтирована с чем-то смешным? Вы используете ACL? Обычно это было бы возможно с членством в группе.
Калеб
5
По сути, ваша система говорит вам: «Вы не можете коснуться -t [его]».
Boehj
@Caleb: Нет, вы можете установить только текущую дату, если вы не являетесь ее владельцем. @Tom: это важно, чтобы дата была соблюдена? Не могли бы вы немного рассказать о требованиях: если пользователь может писать в файл, почему это так важно, если он может им владеть? Обычно в этих ситуациях тот, кто последний раз записывал в файл, владеет им.
Жиль "ТАК - перестань быть злым"
@Tom: Существует очевидное противоречие между «мы не хотим предоставлять этому пользователю root-доступ» и «пользователь может sudo», не могли бы вы объяснить эту часть лучше? Относительно вашего использования rootгруппы: rootгруппа не имеет специальных разрешений, только rootпользователь.
Жиль "ТАК - перестань быть злым"
2
@Tom: ACL = список контроля доступа
Жиль "ТАК, перестань быть злым"

Ответы:

10

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

Когда вы пытаетесь изменить время изменения файла 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; подробности в отдельном вопросе, хотя это уже может быть рассмотрено на этом сайте или на сервере неисправности ).

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

Жиль "ТАК - перестань быть злым"
источник
Спасибо, Жиль, за интересное объяснение. Я не уверен, насколько яснее я могу быть о сценарии использования. NetBeans продолжает выдавать ошибки «невозможно отключить» при каждой синхронизации (хотя файл передается правильно и проверяется на сервере); WinSCP выдает ошибки «установить время: операция не разрешена»; когда я распаковываю файл, я получаю предупреждения о невозможности установить метку времени в будущем. Кроме того, я не знаю, в чем проблема. Я просто хочу иметь возможность синхронизировать локальный каталог с удаленным. через SCP / FTP, и проблема, кажется, временные метки. Это помогает? Возможно нет.
Том Оже
@Tom: Я до сих пор не понимаю, почему вы не можете просто позволить пользователям владеть файлами.
Жиль "ТАК - перестань быть злым"
Некоторые из файлов должны принадлежать Apache (например, каталог загрузки), поэтому я не могу изменить владельца, просто потому, что кто-то работает с некоторыми файлами в каталоге. То, что вы говорите, не имеет смысла - когда я перезаписываю файл с использованием FTP, владелец не обязательно меняет его. Я не вижу необходимости менять это поведение.
Том Оджер
@Tom: владелец не меняется только потому, что это существующие файлы. Я не понимаю, почему вы не позволяете пользователям загружать файлы как apache- тогда они смогут установить время. Смотрите мой исправленный ответ для правильного решения и нескольких неоптимальных.
Жиль "ТАК ... перестать быть злым"
Спасибо, что остался с этим вопросом, Жиль. Использование SVN или другого варианта является неоптимальным с точки зрения развития. Любой, кто занимался веб-разработкой удаленно, может сказать вам, что процесс, как правило, микроинкрементный - особенно при визуальном оформлении - поэтому вы делаете коммиты примерно каждые 30-60 секунд. Если вам нужно постоянно выходить из IDE, запускать коммит и затем просматривать браузер, вы добавляете массу накладных расходов к тому, что должно быть простым процессом. SVN имеет смысл только в контексте, когда несколько разработчиков работают над одной и той же частью сайта. Это отличается от программирования.
Том Оджер
2

Вы можете настроить rsync для использования sudo на удаленном конце следующим образом:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Калеб
источник
Каким будет правило sudo? Простое разрешение rsync позволит пользователю перезаписывать произвольные файлы. Довольно сложно правильно определить ограничения аргументов, и в любом случае здесь я думаю, что вам нужно будет наложить ограничения на ввод rsync, что технически возможно с помощью скрипта-обертки, но не просто.
Жиль "ТАК - перестань быть злым"
Вы правы, разрешить sudo rsyncочень сложно ограничить. Я только предложил это, потому что OP сказал, что у пользователя уже был доступ sudo.
Калеб
Спасибо - это интересно, хотя разработчик работает на Windows, поэтому я не уверен, что rsync - лучший способ. Опять же, как я упоминал в редактировании своего поста, я хочу, чтобы это решение работало для любого обычного пользователя, а не для некоторых привилегированных пользователей, за исключением кого-то, принадлежащего к группе, которая владеет этим конкретным каталогом.
Том Оджер
Я думаю, что следующая вещь, на которую стоит обратить внимание, это настройка ACL (списков контроля доступа), но у меня мало опыта в этой области, поэтому, возможно, некоторые гуру могут добавить ответ и объяснить, если и как это можно сделать.
Калеб