釋出一個基於Go語言的 SSH 遠端終端 WebConsole
基於Golang、WebSocket、TermJS的SSH遠端終端,希望能幫到大家。
主要應用到隔離網路內,SSH遠端終端的訪問問題。
歡迎大家踴躍報名,利用業餘時間來拓展此專案,增加更多的功能服務大家。
更新日誌
2016.03.05
新增:
1、增加 Dockerfile
2016.03.04 釋出 v1.1
新增:
1、增加命令列的啟動、停止、狀態檢視功能. 如: ./apibox start/stop/status
2016.03.03
修證:
1、修改獨立模式時登陸JS驗證問題.
新增:
1、增加後臺執行模式(conf/conf.json. daemon:true/false);
2、增加程式執行時的PID檔案(log/apibox.pid);
大概的資料流向:
瀏覽器--》WebSocket--》SSH--》Linux OS
Github: https://github.com/shibingli/webconsole
演示地址: http://www.pangu.cloud (通過DaoCloud的Docker服務構建)
程式包結構:
├── bin
│ └── apibox
├── conf
│ ├── ssl_cert.crt (預設不存在)
│ ├── ssl_cert.key (預設不存在)
│ ├── conf.json
│ └── mime.types
├── log
├── pkg
├── static
│ ├── images
│ └── scripts
└── template
執行環境要求:
1、Intel 架構
2、Linux Kernel 3.x/x86_64 及更高版本
3、建議 Linux 發行版 CentOS 7.x
4、啟用支援 SSL/TLS 模式訪問時,需要生成對應的 SSL 證書檔案且放置到 "conf" 資料夾下並配置 "conf.json" 檔案
5、客戶端要求使用 IE9、Chrome 40、Firefox 38、Safari 9 或更高版本的瀏覽器訪問
6、伺服器端需要對防火牆開啟對應的外部訪問埠。具體需要開放的埠請參考 "conf" 資料夾下的 "conf.json" 檔案中的埠部分的配置
7、本程式只能對 Linux 類的作業系統且支援 SSH 協議的 OS 進行遠端操作
8、基於Go1.6,原生支援 http2
一、部署
1、將程式解壓至任一目錄,執行 "bin" 資料夾下的 "apibox" 檔案即可。如:"./apibox start/stop"
2、配置檔案在 "conf" 資料夾下,核心配置檔案為 "conf.json"
3、後臺執行可以配置 "conf" 資料夾下的 "conf.json" 檔案,將 "daemon" 項配置為 "true"
4、執行時日誌檔案存放在 "log" 資料夾下,以當天時期命名
5、也可以配置程式以 Nginx 的 fcgi 模式執行,以 Nginx 做為訪問入口
二、使用
1、程式部署完成後,直接通過瀏覽器訪問即可。如: http(s)://ip:port。
2、外部系統引用步驟:
1)、以 GET 或 POST 的方式,提交 "vm_addr" 引數至 "http(s)://ip:port/console/chksshdaddr" ,成功後可獲取到加密後的 "en_addr" 資訊。注:vm_addr 格式為: "ip:port" ,若不攜帶埠,預設埠為 "22" 。
獲取到的結果為 JSON 格式(注:以下資料為測試資料):
成功:
{
"ok": true,
"msg": "",
"data": { "en_addr": "0b-nDgcazQKTmUw4oBLfxott", "sshd_addr": "192.168.220.173:22" }
}
失敗:
{ "ok": false, "msg": "Unable to resolve host address.", "data": null }
2)、成功獲取到加密的 en_addr 資訊後,以 GET 或 POST 方式訪問 "http(s)://ip:port/console/login/'en_addr'" 即可。注: "en_addr" 是通過第 1)步操作獲取的資料。
JQuery Demo:
$.post("/console/chksshdaddr?rnd=" + Math.random(), {
"vm_addr": "192.168.220.177:22"
}, function(data) {
var json = data;
if (typeof(data) != "object") {
json = $.parseJSON(data);
}
if (json.ok) {
alert(json.data.en_addr);
}
});