Rsync 在将文件复制到目标文件夹之前使其不可写(当然,它会因权限被拒绝而失败)

Rsync 在将文件复制到目标文件夹之前使其不可写(当然,它会因权限被拒绝而失败)

我想使用 rsync 通过 SSH 将项目从我的开发机器(Windows 11,CygWin)部署到远程服务器(Ubuntu)。我通过运行以下命令确保我的 SSH 用户对目标文件夹具有完全写访问权限:

root# mkdir /opt/my-project
root# chmod +rwx /opt/my-project
root# cwown -R ubuntu /opt/my-project
ubuntu$ touch /opt/my-project/test && rm /opt/my-project   # No errors

在我的 Windows 机器上,我使用以下 rsync 命令:

C:\cygwin64\bin\rsync.exe -Pav \
    -e "C:/cygwin64/bin/ssh.exe -i <SSH Key File>" \
    ./bin/Release/net6.0/linux-x64/publish/ ubuntu@my_server:/opt/my-project/

我期望此命令启动增量文件同步,并将所有丢失的文件上传到服务器上的项目文件夹。但相反,rsync 工具吐出一堆Permission denied (13)错误,并且无法复制单个文件。最重要的是,当我返回服务器检查目标文件夹时,用户ubuntu不再具有任何形式的访问权限。即使列出文件夹(ls /opt/my-project)也会出现权限被拒绝错误。

这是一个非常奇怪的行为,因为在上传之前,用户ubuntu肯定对目标文件夹具有完全的写访问权限,但 rsync 似乎在传输单个文件之前故意将自己锁定在文件夹之外。

以下是 rsync 命令的简化输出:

sending incremental file list
rsync: failed to modify permissions on "/opt/my-project/.": Permission denied (13)
rsync: recv_generator: failed to stat "/opt/my-project/file1.so": Permission denied (13)
rsync: recv_generator: failed to stat "/opt/my-project/file2.so": Permission denied (13)
...
rsync: recv_generator: mkdir "/opt/my-project/file420.so" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
...
sent 71,147 bytes  received 53,278 bytes  49,770.00 bytes/sec
total size is 314,634,345  speedup is 2,528.71
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=3.2.4dev]

什么原因导致了这种现象?

Rsync 和操作系统版本:

  • 本地:Windows 11,CygWin/rsync 版本 3.2.4dev 协议版本 31
  • 远程:Ubuntu 20.04,rsync 版本 3.1.3 协议版本 31

答案1

由于某种原因,CygWin 自带的默认 rsync 似乎与远程 Linux 文件系统不兼容。解决方案是从这里安装 rsync:https://github.com/Bill-Stewart/CygSSH

通过使用它,一切都按预期进行。

相关内容