神奇的组合,在 cygwin 上通过 ssh 在 Windows 10 上工作



首先,我已经阅读了十几篇类似的帖子,但没有一个推荐的解决方案对我有用。但我对cygwin很陌生,所以大概错过了这些答案假设的东西。

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

因此,通过 ssh 与增量和--ignore-times进行 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:cygwin64bin> .bash.exe /home/davidl/deploy-dev.sh

我收到以下错误:

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

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

无论如何,在另一个策略上,如何从PowerShell运行rsync.exe,而不是bash脚本:

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

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

PS C:cygwin64bin> .rsync.exe -e "ssh -i C:Usersdavidl.sshkey.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:cygwin64bin> .ls.exe -al C:Usersdavidl.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:cygwin64bin> .chgrp.exe -R :Users C:Usersdavidl.ssh
/usr/bin/chgrp: invalid group: ':Users'

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

PS C:cygwin64bin> .chmod.exe -R 600 C:Usersdavidl.ssh
PS C:cygwin64bin> .ls.exe -al C:Usersdavidl.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终端并手动运行脚本之外,我如何才能最轻松地完成此操作?

如果从默认的"登录"外壳内部运行脚本/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(

最新更新