若是你對NodeJs系列感興趣,歡迎關注微信公衆號:前端神盾局 或 github NodeJs系列文章php
身爲一枚合格的搬磚工程師,筆者常常須要登陸服務器去查看日誌或者部署應用,ssh
也隨之成爲最經常使用的linux命令之一。本文主要是對SSH的概念和用法作一些簡單的梳理,大神請繞道。html
SSH是一種加密的網絡傳輸協議,可在不安全的網絡中爲網絡服務提供相對安全的傳輸環境。任何網絡服務均可以經過SSH實現安全傳輸,但平常使用最多的仍是遠程登陸服務器。前端
// 登陸一臺端口爲22,用戶名爲username,ip地址爲xx.xx.xx.xx的遠程主機 ssh -p 22 username@xx.xx.xx.xx
早先,互聯網通訊基本是裸奔的(明文傳輸),這使得內容很容易被竊取或監聽。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登陸信息所有加密,成爲互聯網安全的一個基本解決方案,迅速在全世界得到推廣,目前已經成爲Linux系統的標準配置。node
那SSH是如何實現加密的呢?整個過程以下:linux
固然這個過程並非萬無一失的,依舊存在「中間人攻擊」的風險,具體可參考阮一峯老師的文章:SSH原理與運用(一):遠程登陸git
在實際項目中,筆者常常遇到這樣的一種狀況:因爲測試環境中數據庫和開發數據庫的沒有同步,致使筆者沒法很好的復現bug。github
那有同窗問,爲何不直接連到測試服務器呢?緣由很簡單,連不上。測試環境數據庫服務器並無對外開放。數據庫
因此剛開始的時候,筆者爲此至關苦惱,每次須要驗證數據的時候,都要先把測試環境中數據導出再導入到開發環境中,這樣一趟下來十幾分鍾過去了...瀏覽器
那有什麼方法能夠連到測試數據庫呢?安全
有的,使用ssh本地端口轉發
先來描述一下場景,host1(106.xx.xxx.xx)是遠程主機,是能夠對外訪問的;host2是內網主機(10.xx.xxx.x 安裝了mongo數據庫),只能經過host1訪問,沒法鏈接外網。
咱們須要兩個步驟實現本地端口轉發
const http = require('http'); const server = http.createServer(function(req,res){}); server.listen(5000);
這裏咱們建立了一個端口爲5000的本地服務
ssh -L 5000:10.xx.xxx.x:27017 username@106.xx.xxx.xx
命令中的L參數一共接受三個值,分別是"本地端口:目標主機:目標主機端口",它們之間用冒號分隔。這條命令的意思,就是指定SSH綁定本地端口5000,而後指定host1將全部的數據,轉發到目標主機host2的27017端口。
運行命令,隨後咱們在瀏覽器中打開http://localhost:5000
,能夠看到頁面顯示以下:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
這表示咱們鏈接成功~
ssh
命令挺長的,還有各類ip地址...有沒有簡化版呢?
好吧~咱們可使用tunnel-ssh改造一下
const tunnel = require('tunnel-ssh'); const server = tunnel({ keepAlive: true, // host1 host: '106.xx.xxx.xx', username: 'superTerrorist', password: 'xxxx', port: 22, // 內網主機 host2 dstHost: '10.xx.xxx.x', dstPort: 27017, // 本地端口 localPort: 5000, },async function(error,server){ if(error){ console.log(error); return; } console.log('ssh tunnel connected'); });
這裏咱們使用了第三方包tunnel-ssh實現了本地轉發的功能,每次咱們只要使用node script.js
便可,這比使用ssh
清爽多了。若是各位同窗還有更好的方法,歡迎在此留言討論