用户无法触摸-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方面是一个完全的白痴,并且我是开发人员的“服务器管理员”,所以我只能假设这是我正在做的或配置不正确的白痴。

总结简而言之,我希望对目录具有r / w组访问权限的所有用户都能够通过SCP更改该目录中文件的时间戳。


1
您的文件系统是否装有有趣的东西?您是否在使用ACL?通常,使用组成员身份是可能的。
Caleb

5
基本上,您的系统会告诉您:“您无法触摸-t [his]”。
boehj 2011年

@Caleb:不,除非您是所有者,否则您只能将其设置为当前日期。@汤姆:遵守日期重要吗?您能否扩展一下要求:如果用户可以写入文件,那么如果他可以拥有文件又为什么重要呢?通常,在这种情况下,最后写入文件的人都拥有它。
吉尔(Gilles)“所以,别再邪恶了”,

@Tom:“我们不想让该用户具有root用户访问权限”与“用户可以sudo”之间存在明显的矛盾,您能否更好地解释这一部分?关于您对root群组的使用:root群组没有特殊权限,只有root用户拥有。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


10

为什么它不起作用

当您尝试使用touch或更一般地通过基础系统调用来更改文件的修改时间时utime,有两种情况。

  • 您正在尝试将文件的修改时间设置为特定时间。这要求您是文件的所有者。(从技术上讲,该进程的有效用户ID必须是文件的所有者。²)
  • 您正在尝试将文件的修改时间设置为当前时间。仅当您有权写入文件时,此方法才有效。发生此异常的原因是,无论如何,您可以通过覆盖具有相同值¹的文件的现有字节来达到相同的效果。

为什么这通常无关紧要

  • 当您使用ftp,scp,rsync等复制文件时,该副本会创建一个新文件,该文件归谁进行复制。因此,复印机有权设置文件的时间。
  • 使用rsync,您将无法设置现有目录的时间:它们将被设置为上次文件同步的时间。在大多数情况下,这无关紧要。您可以通过传递--omit-dir-times-O)来告诉rsync不要打扰目录时间。
  • 对于版本控制系统,修订日期存储在文件内部;文件上的元数据通常无关紧要。

解决方案

所有这些都与在单一开发人员场景中启用PHP开发(即:没有SCM)有关。

好吧,就在那儿停下来。仅因为只有一个开发人员,并不意味着您不应该使用SCM。您应该使用SCM。让开发人员检入文件,并给他一种方法,按“部署”按钮将文件从SCM检出到实时目录中。

绝对没有技术上的原因使您不应该使用SCM,但可能是人为的原因。如果使用这些文件的人称自己为“开发人员”,则应使用SCM。但是,如果这是由非技术人员来推入文档,则SCM可能太复杂了。因此,继续通过FTP或SSH推送文件。这可以通过三种方式进行。

  • 您真的需要同步时间吗?如上所述,rsync可以选择不同步时间。除非您告知,否则Scp不会。我不知道WinSCP,但也可能知道。
  • 继续做您正在做的事情,只是忽略有关时间的消息。文件仍在复制中。这不是一个好选择,因为忽略错误总是有风险的。但这在技术上是可能的。
  • 如果您需要灵活地填充apache用户拥有的文件,则通常的方法是允许用户SSH访问为apache。一种简单的方法是让用户创建SSH私钥并将相应的公钥添加到中~apache/.ssh/authorized_keys。这意味着用户将能够以用户身份运行任意命令apache。由于无论如何您都可以授予用户sudo权限,因此这与您的情况无关。可能但不那么容易施加更多限制(您需要一个单独的用户数据库条目,该条目具有不同的名称,相同的用户ID,受限制的shell和chroot监牢;尽管可能已经涵盖了单独问题中的详细信息,在此站点上或在Server Fault上)。

¹ 或者,对于一个空文件,写一个字节然后截断。
² 除其他并发症外,我所知道的都不适用。


感谢Gilles,提供了有趣的解释。我不知道我能对用例有多清楚。每当我同步时,NetBeans都会继续抛出“无法断开连接”错误(尽管文件已正确传输并在服务器上进行了验证);WinSCP抛出“设置时间:不允许操作”错误;解压缩文件时,会收到有关无法将时间戳记设置为将来某个时间的警告。除此之外,我不知道问题出在哪里。我只是希望能够将本地同步到远程目录。通过SCP / FTP,问题似乎是时间戳记。这有帮助吗?可能不是。
Tom Auger

@汤姆:我仍然不明白为什么你不能仅仅让用户拥有文件。
吉尔(Gilles)“所以,别再邪恶了”,

有些文件需要归Apache所有(例如,uploads目录),所以我不能更改所有者,因为有人正在处理目录中的某些文件。您的意思没有任何意义-当我使用FTP覆盖文件时,所有者不一定会更改。我认为没有必要更改此行为。
Tom Auger

@Tom:所有者不会仅因为这些是现有文件而进行更改。我不明白为什么您不让用户上传文件,那样apache他们就可以设置时间。有关正确的解决方案和几个次优的解决方案,请参见我的修订答案。
吉尔斯(Gilles)'所以

感谢您坚持提出这个问题。从开发角度来看,使用SVN或某些变体不是最佳选择。远程完成Web开发的任何人都可以告诉您该过程通常是微增量的-尤其是在视觉样式化时-因此,您大约每30-60秒进行一次提交。如果必须不断退出IDE,运行一次提交,然后预览浏览器,那么您将为一个简单的过程增加大量的开销。SVN仅在多个开发人员在站点的同一部分上工作时才有意义。它不同于编程。
Tom Auger

2

您可以将rsync设置为在远程端使用sudo,如下所示:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/

sudo规则是什么?简单地允许rsync将允许用户覆盖任意文件。正确设置参数限制非常困难,无论如何,我认为您需要对rsync的输入施加限制,这在技术上可以通过包装脚本来实现,但并不容易。
吉尔(Gilles)'所以

您是对的,允许sudo rsync很难限制。我只是建议这样做,因为OP表示用户已经具有sudo访问权限。
Caleb

谢谢-这很有趣,尽管开发人员在Windows机器上,所以我不确定rsync是最好的方法。再次,正如我在帖子的编辑中提到的那样,我希望该解决方案适用于除拥有该特定目录的组中的某人之外的任何普通用户,而不是某些特权用户。
Tom Auger

我认为接下来要研究的是设置ACL(访问控制列表),但是我在这方面的经验很少,因此也许一些专家可以添加答案并解释是否以及如何完成此操作。
Caleb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.