当 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
为什么它不起作用
当您尝试使用以下命令更改文件的修改时间时touch
,或者更一般地使用底层系统调用utime
,有两种情况。
- 您正在尝试将文件的修改时间设置为特定时间。这要求您是该文件的所有者。 (从技术上讲,进程的有效用户ID必须是文件的所有者。²)
- 您正在尝试将文件的修改时间设置为当前时间。当且仅当您有权写入该文件时,此操作才有效。出现此异常的原因是,无论如何,您都可以通过使用相同的值覆盖文件的现有字节来实现相同的效果。
为什么这通常并不重要
- 当您使用 ftp、scp、rsync 等复制文件时,副本会创建一个新文件,该文件归复制者所有。所以复印机有权限设置文件的时间。
- 使用 rsync,您将无法设置现有目录的时间:它们将被设置为文件上次在其中同步的时间。在大多数情况下,这并不重要。您可以通过传递
--omit-dir-times
( )告诉 rsync 不要理会目录时间-O
。 - 使用版本控制系统,修订日期存储在文件内;文件上的元数据大多无关紧要。
解决方案
这一切都与在单一开发人员场景中启用 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 监狱的单独用户数据库条目;详细信息在单独的问题中,尽管这可能已经被涵盖在本网站或服务器故障)。
¹或者,对于空文件,写入一个字节,然后截断。
²除非有其他复杂情况,但据我所知,没有一个适用于此。
答案2
您可以设置 rsync 以在远程端使用 sudo,如下所示:
rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/