本系列文章分为基础篇、安全篇、扩展篇。如果对fjpublish不了解或者不了解本文提到的童鞋,请花5分钟看完基础篇:使用fjpublish发布前端项目(基础篇)前言自上期sf安利使用fjpublish发布项目,收到很多评论。一些小伙伴的star和建议证明fjpublish确实是一个对前端圈子有帮助的轮子。今天随着fjpublish2.0.0正式版的发布,我们就来说说如何使用fjpublish安全发布项目。也可以直接查看文档原文。相信服务器登录信息的安全是小伙伴们关注的重点。对于把生产服务器的密码放在别人开发的工具的配置文件里,睡觉可能不安全。。。所以如何使用fjpublish更新为了安全,下面列举了几种方法,请按照您要发布的环境和掌握的难度。1.版本忽略文件(安全级别★)将配置文件添加到版本忽略列表是最简单也是最不稳定的方法,因为你可能随时忘记将配置文件添加到版本忽略列表,密码会会被暴露,但是如果都是在内网发布,那么问题就不会太大。//例如在.gitignore中添加这一行...fjpublish.config.js...2.命令选项配置(安全级别★★)可以在每个版本中使用fjpublishenv--ssh选项当时配置服务器信息,这样配置文件中就不会配置ssh字段了。服务器参数的格式为:[env:]<@host>[:port][#password]。密码可以省略。如果省略密码,fjpublish会在命令确认后弹出单独的输入框填写密码,完全模拟ssh的登录行为,例如:fjpublishenvtest--sshroot@192.168.0.100。如果同时发布多个环境,请写明当前设置的ssh信息是为哪个环境设置的,例如:fjpublishenvtest,public--sshpublic:root@192.168.0.100#123456,如果只发布一个环境,可以省略。不过这个命令实际使用起来很麻烦,不过也省去了在配置文件中写密码的烦恼。3.免密发布(安全等级★★★)fjpublish配置文件中的ssh选项完全是ssh2库的选项,所以熟悉ssh登录服务器的同学应该都知道,不用密也可以登录服务器密码。原理是将本地公钥放在服务器的凭证文件中,下次登录服务器就不需要密码了。操作步骤简述如下:使用ssh-keygen-b1024-trsa生成一对公私钥,无需密码;将公钥内容附加到服务器的~/.ssh/authorized_keys;好吧,现在你可以每次使用ssh登录服务器而无需服务器密码。原谅我写的这么草率,因为这个过程不是我想说的重点,我也给你准备了一篇文章,或者你可以再谷歌几篇关于“免密登录服务器”的文章。另外,fjpublish还有一个fjpublishauth[--key]命令可以快速认证公钥文件进入服务器。如果你有兴趣,你可以了解一下。那么fjpublish对应的配置文件需要修改为如下配置:module.exports={modules:[{name:'testenvironment',env:'test',ssh:{host:'12.23.345.678',username:'root',//rc版本的user选项和userName选项以后统一配置为用户名//privateKey为服务器认证的公钥对应的私钥地址,请灵活使用privateKey:require('fs').readFileSync('/Users/manman/.ssh/id_rsa')//mac用户示例privateKey:require('fs').readFileSync('C:/User/manman/.ssh/id_rsa')//window用户示例privateKey:require('fs').readFileSync(`${require('os').homedir()}/.ssh/id_rsa`)//通用写法},buildCommand:'build',localPath:'example',remotePath:'/www/example',}],},即使你的配置文件不小心泄露了,没有你的私钥文件也无法登录服务器。但说实话,私钥文件还是可以被fjpublish开发者和依赖库开发者读取到的,不能算绝对安全。(我发誓我没有写后门,我也怕依赖库的开发者盗用我的私钥)4.免密发布高级版(安全等级★★★★)是其实是一个进阶版,只不过这次生成了一对带密码的公私钥,这样每次ssh登录服务器都需要输入私钥的密码,而不是服务器的密码服务器。fjpublish对应的配置文件中的ssh项需要改为如下配置:module.exports={modules:[{name:'testenvironment',env:'test',ssh:{host:'12.23.345.678',username:'root',//rc版本的user选项和userName选项以后统一配置为username//privateKey为服务器认证的公钥对应的私钥地址,请灵活使用privateKey:require('fs').readFileSync('/Users/manman/.ssh/password')//mac用户privateKey:require('fs').readFileSync('C:/User/manman/.ssh/password')//windowuserprivateKey:require('fs').readFileSync(`${require('os').homedir()}/.ssh/password`)//一般写法passphrase:'123456'//Privatekeypassword},buildCommand:'build',localPath:'example',remotePath:'/www/example',}],}...但这并不是绝对安全的,请继续阅读。5.终极大招(安全等级★★★★★)是时候释放大招了。这是方法4的升级版,对于私钥中的密码,不需要写到配置文件中。我们可以先在本机使用ssh代理(ssh-agent)记录私钥密码,这样发布时既不需要私钥密码也不需要服务器密码。简而言之,ssh-agent是一个用来帮助你记住私钥密码的程序。是OpenSSH默认自带的ssh代理程序。由于篇幅有限,这里就不介绍如何配置ssh-agent了。请务必阅读本文。这时候fjpublish的配置文件应该改成这样:module.exports={modules:[{name:'testenvironment',env:'test',ssh:{host:'12.23.345.678',username:'root',//rc版本的user选项和userName选项以后统一配置为usernameagent:process.env.SSH_AUTH_SOCK,agentForward:true,},buildCommand:'build',localPath:'example',remotePath:'/www/example',}],}这样就不用担心密码泄露了,但是配置过程比较复杂。通常第四点已经很安全了。连大名鼎鼎的xshell都被曝有后门,所以有什么是绝对安全的。文件操作安全fjpublish就像一个黑盒子,用户只需要设置配置文件,fjpublish就会完成设置的任务,那么问题来了,如果配置不正确,会不会对服务器上的文件造成不可挽回的破坏?本地计算机或远程服务器呢绒布。其实fjpublish里面写了很多关键的判断,专门开发了一个--check选项来检查。如果第一次使用有点不放心,可以使用这个功能检查一下。例如如下配置:module.exports={modules:[{name:'testenvironment',env:'test',ssh:{host:'192.168.0.xxx',username:'root',//rc版本请配置user选项和userName选项为usernamepassword:'123456'},remotePath:'/abc',}],completeHook(fj){console.log(fj._metadata.modules.test);},}显然,这个配置文件存在以下问题:buildCommand没有设置;localPath或localPathEntries未设置;remotePath远程文件路径为不安全路径(非二级目录以上的绝对路径)。然后我们输入命令fjpublishenvtest--check,此时fjpublish会跳过所有中间件文件操作的过程,只执行参数判断的部分,然后在最先检测到错误的地方停止并抛出错误,你可以试试看,一一改正再试。如果你的参数配置正确,那么你可以关注一下钩子函数completeHook打印出来的数据,其中'_commands'表示要在远程环境中执行的命令。如果没有危险操作,那就没问题。其实再安全也是扯淡,有些错误只能在运行时发现,所以最安全的做法是:请先在测试环境中尝试fjpublish!!!结束语有兴趣的童鞋可以直接移步官方文档了解更多,别忘了在github上给我一个star。下一期我们会讲到如何使用fjpublish来扩展和解锁更多的功能,再见∩__∩y。fjpublish官方交流群:608809145