如何在gulp-rsync和cygwin中使用ssh密钥

时间:2016-10-31 00:33:27

标签: windows ssh gulp cygwin

我正在使用gulp任务来部署我的应用程序,就像这样(在这个例子中我省略了真正的值)

gulp.task('deploy', function () {
return gulp.src(config.deployFiles)
        .pipe(rsync({
            root: 'build/',
            hostname: 'hostname',
            username: 'username',
            destination: 'destination'
     }));});

但是,该命令失败并带有

gulp-rsync:权限被拒绝(publickey)。

注意:我可以通过ssh访问远程服务器,关键是如何告诉cygwin使用正确的ssh密钥以便gulp-rsync可以使用它?

3 个答案:

答案 0 :(得分:2)

你是对的@ojb。当我想使用gulp作为我的自动化工作流程的一部分在线推送我的生产准备代码时,我也陷入了类似的境地。

基本上没有标准参数作为gulp-rsync中的ssh_key_location传递。因此,解决方法是使用ssh配置文件来创建本地伪主机名。此过程使用伪主机名屏蔽实际主机名

  

(ec2-xx-xxx-xxx-xxx.ap-west-2.compute.amazonaws.com + key )=>   hostname.com

由于没有关于如何解决此问题的正确文档,因此对于可能面临此问题的每个人都有详细的操作方法

第一步:更新〜/ .ssh / config文件以使其正常工作:$ ssh hostname.com

Host hostname.com
    HostName ec2-xx-xxx-xxx-xxx.ap-west-2.compute.amazonaws.com
    User ec2-user
    IdentityFile ~/<path-to-file>/keyfile.pem

第二步:

将此添加到您的gulp功能

  // Dirs and Files to sync
  rsyncPaths = ['directory-names', './file-name',....];
  // Default options for rsync
  rsyncConf = {
    progress: true,
    incremental: true,
    relative: true,
    emptyDirectories: true,
    recursive: true,
    clean: true,
    exclude: [],
  };

第三步:在gulp中创建以下功能

//something-on-top    
return gulp.src(rsyncPaths)
   .pipe($.rsync(rsyncConf));

<强>故障排除:  1.检查文件是否具有400访问权限  2.检查$ ssh hostname.com是否有效

答案 1 :(得分:1)

这是我到目前为止找到的解决方案。在cygwin终端运行

ssh-host-config

它会在cygwin / etc文件夹(/ etc / ssh_config)中创建一个配置文件。然后,向该文件添加主机条目

  Host hostnameToUse
       Hostname xx.xx.xx.xx.xx
       Port 22
       IdentityFile D:\keys\vps

然后将gulp任务中的主机名更新为'hostnameToUse' gulp deploy工作:

gulp-rsync:发送增量文件列表....

答案 2 :(得分:0)

最近才遇到这个问题,并设法将其整合在一起。由于网上没有其他人发布解决方案,所以我想在这里履行职责并将其传递下去。希望它对其他人仍然有用:

gulp-rsync 默认情况下不支持此功能,但是早在2015年,运行命令(https://github.com/jerrysu/gulp-rsync/issues/17)时,所有自定义选项都添加了功能。您可以将-e选项附加到您的shell命令中,如下所示:

var gulp = require('gulp');
var rsync = require('gulp-rsync');

gulp.task('deploy', function() {
  gulp.src('build/**')
    .pipe(rsync({
      username: 'user',
      hostname: 'host',
      destination: '~/',

      options: {
        "e": "ssh -i <local-path-to-key-file>"
      }

    }));
});