魔术组合可在Windows 10上通过SSH在Cygwin上实现rsync

时间:2018-08-08 18:43:35

标签: powershell ssh cygwin rsync

首先,我已经阅读了十几篇类似的文章,但没有推荐的解决方案对我有用。但是我对cygwin还是陌生的,所以大概会错过那些答案所假定的内容。

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

因此,使用Delta和--ignore-times在ssh上进行rsync似乎是一个不错的解决方案。请注意,服务器接受带有公钥的ssh。

我已经安装了cygwin,并且从cygwin终端中,我已经用密钥配置了ssh,并创建了一个配置文件。现在,在cygwin终端窗口中,可以执行以下操作:

$ 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.

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

无论如何,换句话说,如何仅从PowerShell运行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在本地文件上设置正确的组或权限,而从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终端并手动运行脚本之外,我如何才能最轻松地完成此操作?

1 个答案:

答案 0 :(得分:1)

如果从默认的“登录”外壳内部运行脚本/home/davidl/deploy-dev.sh并以

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

失败,原因在于缺少登录设置。您可以 使用bash的选项-l克服了这个问题。

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

PS:默认情况下,Mintty aka Cygwin Terminal快捷方式运行一个登录Shell)