我想使用 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
通过使用它,一切都按预期进行。