在 Windows 10 上通过 ssh 在 cygwin 上获得 rsync 的神奇组合

Magic combination to get rsync on cygwin over ssh working on Windows 10

首先,我已经阅读了十几篇关于此的类似帖子,none 推荐的解决方案对我有用。但我是 cygwin 的新手,所以可能遗漏了那些答案假设的东西。

用例:我正在尝试创建一种方法,将更改后的文件从 Windows 10 开发机器上传到服务器。这适用于某些 Web 开发,其中本地构建工具首先删除所有现有文件,因此时间戳比较不好。我试过 WinSCP,但它不支持校验和同步(即使我正在 运行ning proftpd SFTP 支持——该功能的 WinSCP 跟踪器 3 年没有更新)。如果有某种方法可以让 WinSCP 执行此操作,我将很乐意放弃下面的所有内容。

因此,通过带有增量的 ssh rsync 和 --ignore-times 似乎是一个很好的解决方案。请注意,服务器 接受带有 public 密钥的 ssh。

我已经安装了 cygwin,并且从 cygwin 终端,我已经使用密钥配置了 ssh,并创建了一个配置文件。在 cygwin 终端 window 中,我现在可以:

$ ssh server.com

没问题,还有类似的东西:

$ rsync -e ssh /local/source server.com:/remote/target

现在,本地构建工具 运行 来自 PowerShell 的命令行,所以作为最后一步,我希望能够 运行 上传输出的命令构建到服务器。看似简单...

首先,在 cygwin 终端中,我尝试制作一个名为 deploy-dev.sh 的 bash 脚本。如果我 运行 这个 来自 cygwin 终端 ,它工作正常。但是如果我从 PowerShell 运行 这个:

PS C:\cygwin64\bin> .\bash.exe /home/davidl/deploy-dev.sh

我收到以下错误:

Warning: Identity file /home/davidl/.ssh/key.pem not accessible: No such file or directory.

但它确实在 C:\Users\davidl\.ssh 中创建了一个 known_hosts 文件。所以我在那里复制了 ssh 密钥。但是我仍然得到同样的错误——仍然不知道为什么。

无论如何,换个思路,从 PowerShell 中 运行ning rsync.exe,而不是 bash 脚本怎么样:

PS C:\cygwin64\bin> .\rsync.exe -e ssh test.txt server.com:/target
Bad owner or permissions on C:\Users\davidl/.ssh/config

好的,暂时忽略它并尝试直接加载密钥:

PS C:\cygwin64\bin> .\rsync.exe -e "ssh -i C:\Users\davidl\.ssh\key.pem" test.txt admin@server.com:/target
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\Users\davidl\.ssh\key.pem' are too open.

进步了!它正在查看正确的文件。那么权限:

PS C:\cygwin64\bin> .\ls.exe -al C:\Users\davidl\.ssh\
total 14
drwxr-xr-x 1 davidl None    0 Aug  8 19:04 .
drwxr-xr-x 1 davidl None    0 Aug  8 18:33 ..
-rw-r--r-- 1 davidl None 1692 Aug  8 19:02 key.pem
-rw-r--r-- 1 davidl None   94 Aug  8 19:04 config
-rw-r--r-- 1 davidl None  187 Aug  8 19:02 known_hosts

嗯。那看起来不对。因此,根据有关此类问题的许多答案,使用 chgrpchown 修复它:

PS C:\cygwin64\bin> .\chgrp.exe -R :Users C:\Users\davidl\.ssh\
/usr/bin/chgrp: invalid group: ':Users'

好的,也许只有权限就足够了:

PS C:\cygwin64\bin> .\chmod.exe -R 600 C:\Users\davidl\.ssh\
PS C:\cygwin64\bin> .\ls.exe -al C:\Users\davidl\.ssh\
total 14
drwxr-xr-x 1 davidl None    0 Aug  8 19:04 .
drwxr-xr-x 1 davidl None    0 Aug  8 18:33 ..
-rw-r--r-- 1 davidl None 1692 Aug  8 19:02 key.pem
-rw-r--r-- 1 davidl None   94 Aug  8 19:04 config
-rw-r--r-- 1 davidl None  187 Aug  8 19:02 known_hosts

所以现在我卡住了。我无法通过 cygwin 对本地文件设置正确的组或权限,并且从 inside cygwin 终端查看它们,权限看起来还是正确的:

davidl@DESKTOP2 /cygdrive/c/Users/davidl/.ssh
$ ls -al
total 14
drwx------+ 1 davidl None      0 Aug  8 19:04 .
drwxrwx---+ 1 SYSTEM SYSTEM    0 Aug  8 18:33 ..
-rw-------+ 1 davidl None     94 Aug  8 19:04 config
-rw-------+ 1 davidl None   1692 Aug  8 19:02 key.pem
-rw-------+ 1 davidl None    187 Aug  8 19:02 known_hosts

请注意,我已经检查过这是在 NTFS 装载上,而不是 FAT32。

除了必须打开 cygwin 终端和手动 运行 脚本之外,我怎样才能最轻松地完成此操作?

如果从默认 "login" shell 中运行脚本 /home/davidl/deploy-dev.sh 并且 运行 为

.\bash.exe /home/davidl/deploy-dev.sh

失败,区别在于缺少登录设置。你可以 使用 bash 的选项 -l 克服了它。

.\bash.exe -l /home/davidl/dploy-dev.sh

PS:Mintty 又名 Cygwin 终端快捷方式默认运行登录 shell)