目标上的rsync和写入权限


8

我一直想知道为什么要rsync尝试将文件传输到远程位置,该位置具有目标目录的读/执行权限,但是没有权限来创建实际的目标文件。当尝试以普通用户的身份将文件复制到/时,甚至可以在本地模拟,这rsync将传输整个文件(对于大文件也要花费相当长的时间),最终失败

rsync: mkstemp "/.myTargetFile" failed: Permission denied (13)

因此,在尝试在传输过程中创建临时文件(文件)时,启动似乎已经失败。为什么它没有注意到这一点并提前中止,而不是尝试在没有任何写权限的情况下复制整个文件?

如果无法创建临时文件,它将文件复制到何处?我看不到rsync进程的任何内存增加,也没有在/ tmp中找到相应的文件。似乎它直接丢弃了目的地的数据,但仍继续传输。

Answers:


5

如果您需要复制到没有写许可权的目录中,请添加--inplace到命令选项。有时会便宜一些,因为它不会创建临时副本,但是在更新过程中,文件处于不一致状态。

关于为什么它不事先检查自己的权利的问题:它可能会错过扩展访问ACL的一些其他细节,因此rsync不相信标准的3 * 3 + 3方案。OTOH这项有意的政策不会对结果产生任何实质性的影响-无论如何文件不会更新。


感谢您的答复,但这只是一个模糊的猜测,并不能真正回答我的问题。即使使用--inplace它也可以传输整个文件,直到注意到缺少写许可权为止。
scai 2012年

1
虽然这不能回答OP的帮助,--inplace但当您有权写入文件但不包含目录时,使用很有用。
tokland

但这就是我的解决方案(我生成了tmp文件,但没有重命名为原始名称),所以谢谢
roothahn

4

错误跟踪程序中所述,这似乎是当前rsync协议的缺点。rsync协议无法预先确定它是否对目标具有写权限。相反,它只是发送并随后检查成功或失败。


2

Rsync在目标文件的同一文件夹中创建临时文件,因此,在这种情况下,您必须将一些文件复制到/,因为您没有以root身份启动它,并且通常/只能由root写入,因此失败。

要找出要复制的文件,请传入参数 -v


1
我知道rsync会在与目标目录相同的文件夹中创建其临时文件。但是,即使无法创建这些临时文件,它也会开始传输并在之后失败而不是一开始就检查是否具有所有必需的写入权限。我想知道为什么会这样。
scai 2012年
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.