对NodeJs系列感兴趣的朋友请关注微信公众号:前端S.H.I.E.L.D.或者githubNodeJs系列文章作为一名合格的搬砖工程师,笔者经常需要登录服务器查看日志或者部署应用,ssh也成为最常用的Linux命令之一。本文主要是简单梳理一下SSH的概念和用法,请绕道。什么是SSSHSS是一种加密的网络传输协议,可以在不安全的网络中为网络服务提供相对安全的传输环境。任何网络服务都可以通过SSH实现安全传输,但最日常的使用还是远程登录服务器。//登录远程主机,端口22,用户名username,ip地址xx.xx.xx.xxssh-p22username@xx.xx.xx.xx之前上网基本都是裸奔(明文传输),这使得内容很容易被窃取或收听。1995年,芬兰学者TatuYlonen设计了SSH协议,将所有登录信息加密,成为互联网安全的基本解决方案。它迅速在全球推广,现已成为Linux系统的标准配置。SSH是如何实现加密的?整个过程如下:远程主机收到用户的登录请求,将自己的公钥发送给用户;用户使用此公钥加密登录密码并发回。远程主机使用自己的私钥解密登录密码,如果密码正确,则允许用户登录。当然,这个过程也不是万无一失的,仍然存在“被人盯上”的风险中间攻击”。具体可以参考阮一峰老师的文章:SSH原理与应用(一):远程登录本地端口转发在实际项目中,笔者经常遇到这样一种情况:由于数据库中的数据库之间没有同步测试环境和开发数据库,??作者无法很好地复现bug。那么有同学问了,为什么不直接连接测试服务器呢?原因很简单,无法连接。测试环境数据库服务器不对外开放。所以一开始,笔者对此颇为苦恼。每次需要验证数据的时候,都得先把测试环境的数据导出,再导入到开发环境。这一趟下来用了十多分钟...那么有什么方法可以连接到测试数据库呢?对,先用ssh本地端口转发来描述场景。host1(106.xx.xxx.xx)是远程主机,可以被外部访问;host2为内网主机(10.xx.xxx.x安装了mongo数据库),只能通过host1访问,无法连接外网。我们需要两步实现本地端口转发,创建本地服务器consthttp=require('http');constserver=http.createServer(function(req,res){});server.listen(5000);这里我们创建了一个本地服务ssh,端口为5000forwardsssh-L5000:10.xx.xxx.x:27017username@106.xx.xxx.xx命令中的L参数一共接受三个值,分别是“本地端口:目标主机:目标主机端口”,以冒号分隔。这条命令的意思是指定SSH绑定本地5000端口,然后指定host1将所有数据转发到目标主机host2的27017端口。运行命令,然后我们在浏览器中打开http://localhost:5000,可以看到页面显示如下:看起来你正在尝试通过本机驱动程序端口通过HTTP访问MongoDB。这样就说明我们连接成功了~ssh命令挺长的,还有各种ip地址。。。有简化版的吗?嗯~我们可以用tunnel-ssh来改造consttunnel=require('tunnel-ssh');constserver=tunnel({keepAlive:true,//host1host:'106.xx.xxx.xx',username:'superTerrorist',password:'xxxx',port:22,//内网主机host2dstHost:'10.xx.xxx.x',dstPort:27017,//本地端口localPort:5000,},asyncfunction(error,server){if(error){console.log(error);return;}console.log('ssh隧道已连接');});这里我们使用第三方包tunnel-ssh来实现本地转发功能,每次只需要使用nodescript.js,比使用ssh清爽多了。如果大家有更好的方法,欢迎在此留言讨论,参考SecureShell鸟哥的Linux私房菜SSH原理及应用
