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

标签 powershell ssh cygwin rsync

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

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

因此,通过 ssh 进行 rsync 与 deltas 和 --ignore-times似乎是一个很好的解决方案。请注意,服务器只接受带有公钥的 ssh。

我已经安装了 cygwin,并且从 cygwin 终端,我已经使用 key 配置了 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 key 。但我仍然遇到同样的错误——仍然不知道为什么。

无论如何,换一种方式,直接运行rsync.exe 怎么样?来自 PowerShell,而不是 bash 脚本:
PS C:\cygwin64\bin> .\rsync.exe -e ssh test.txt server.com:/target
Bad owner or permissions on C:\\Users\\davidl/.ssh/config

好的,暂时忽略它并尝试直接加载 key :
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

唔。那看起来不对。所以,用 chgrp 修复它和 chown根据发布的有关此类事情的许多答案:
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 终端并手动运行脚本之外,我怎样才能最轻松地完成此操作?

最佳答案

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

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

失败,比差异是由于缺少登录设置。你可以
使用选项 -l 克服了它重击。
.\bash.exe -l /home/davidl/dploy-dev.sh

PS:Mintty aka Cygwin Terminal 快捷方式默认运行登录 shell)

关于powershell - 在 Windows 10 上通过 ssh 在 cygwin 上获得 rsync 的神奇组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51753651/

相关文章:

c - cygwin $'\r':找不到命令错误

windows - 从 PowerShell 设置 Windows 更新首选项时出错

windows - Docker 在 Windows 容器上的健康检查和退出代码 ("||"linux 等效)

Powershell 自定义 Cmdlet - 在后台线程中调用 WriteObject

ruby - 如何使用 Ruby 测试 SSH 连接

linux - 是否可以在腻子中使用远程命令选项运行多个命令?

powershell - 使用 csv 的 ForEach 中的 If 语句

ssh - 如何了解 fail2ban ssh 过滤器是否正在使用新端口?

c++ - shared_ptr 无法解析

c++ - Eclipse CDT 在发布版本中定义了 DEBUG