用户不能触摸 -t

Tom*_*ger 10 ftp scp permissions

当 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 更改该目录中文件的时间戳。

Gil*_*il' 10

为什么它不起作用

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

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

为什么这通常无关紧要

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

解决方案

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

好吧,停在那里。仅仅因为只有一个开发人员并不意味着您不应该使用 SCM。您应该使用 SCM。让开发人员签入一个文件,并让他按下“部署”按钮将文件从 SCM 签出到 live 目录中。

您不应该使用 SCM 绝对没有技术原因,但可能有人为原因。如果处理这些文件的人将自己称为“开发人员”,那么他应该使用 SCM。但是如果这是一个非技术人员推入文档,SCM 可能太复杂了。所以继续通过 FTP 或 SSH 推送文件。这可以通过三种方式发挥作用。

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

¹或者,对于空文件,写入一个字节然后截断。
²除非有额外的并发症,但我所知道的都不适用于这里。