網頁中實時檢視伺服器日誌(websocket + node.js實現)
阿新 • • 發佈:2019-02-20
每當我需要檢視linux伺服器的日誌時,我都需要通過SSH客戶端訪問,如果想讓其他人也能檢視日誌,首先需要安裝一個SSH客戶端,然後設定連線資訊,如果安全性高一點的,還需要額外在linux伺服器上配置【檢視日誌使用者】,表示許可權僅限於檢視日誌。每增加一個人想檢視日誌,都需要重複這個步驟,並且大大降低了密碼的私密性。
所以如果能通過網頁形式提供【實時檢視日誌】功能,就可以很好地避免了這些問題。
需求模型:把整個過程看成三個節點,瀏覽器-node.js伺服器-linux伺服器,它們之間的通訊過程如圖顯示:
瀏覽器端程式碼:
var host = '192.168.1.109'; var port = 8991; var url = 'ws://' + host + ':' + port + '/'; var wsc = new WebSocket(url); wsc.onopen = function () { console.log("Connection opened."); }; wsc.onmessage = function (e) { console.log("Message received."); }; wsc.onclose = function () { console.log("Connection closed."); };
node.js端程式碼(require: einaros/ws + ssh2):
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({ port: 8991 });
wss.on('connection', function connection(ws) { ws.on('message', function incoming(signal) { console.log('received: %s', signal); connectSsh(ws); }); ws.on('close', function close() { console.log('disconnected') }); }); var Client = require('ssh2').Client; function connectSsh(wsc) { var conn = new Client(); conn.on('ready', function () { console.log('Client :: ready'); conn.exec('tail /tmp/debug.log', function (err, stream) { if (err) throw err; stream.on('close', function (code, signal) { console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); conn.end(); }).on('data', function (data) { console.log('STDOUT: ' + data); wsc.send(data); }).stderr.on('data', function (data) { console.log('STDERR: ' + data); }); }); }).connect( { host: '192.168.100.100', port: 22, username: 'frylock', password: "pass" //privateKey: require('fs').readFileSync('/here/is/my/key') }); return conn; }
類似這種開發、運維需求基本上可以用這種方式實現。