webssh-xterm.js的簡單使用

xterm是一個使用TypeScript編寫的前端終端組件翅帜。

1振愿、demo主要介紹

本文demo主要實現(xiàn)一個頁面一個webssh窗口,前端部分主要利用xterm通過原生ws和后端通信,后端部分使用nodejs+utf8+ws+ssh2

頁面效果

簡要流程

2弥臼、前端實現(xiàn)

基于vue項目,前端主要依賴包:xterm xterm-addon-fit根灯,使用前請install醋火。

<template>
  <div id="xterm"/>
</template>

<script>
import 'xterm/css/xterm.css'
import { Terminal } from 'xterm';
import { FitAddon } from "xterm-addon-fit";

export default {
  name: 'WebShell',
  data() {
    return {
      socketURI: 'ws://localhost:2000/'
    }
  },
  mounted() {
    this.initSocket()
  },
  beforeDestroy() {
    this.socket.close()
    this.term && this.term.dispose()
  },
  methods: {
    initTerm() {
      let element = document.getElementById('xterm');
      // 設置了cols或者fitAddon.fit(); 當一行字符超過80個過會替換現(xiàn)在的內容,否則換行
      const term = new Terminal({
        cursorBlink: true, // 關標閃爍
        cursorStyle: "underline", // 光標樣式 'block' | 'underline' | 'bar'
        scrollback: 100, // 當行的滾動超過初始值時保留的行視窗箱吕,越大回滾能看的內容越多芥驳,
      });
      this.term = term;
      const fitAddon = new FitAddon();
      this.term.loadAddon(fitAddon);
      this.fitAddon = fitAddon;
      term.open(element);
      // 自適應大小(使終端的尺寸和幾何尺寸適合于終端容器的尺寸),初始化的時候寬高都是對的
      fitAddon.fit();
      term.focus();

      this.term.onData(data =>  {
        this.socket.send(data);
      });

      window.addEventListener('resize', this.resizeTerm);
    },
    getColsAndRows(element) {
      // 暫時不用
      element = element || document.getElementById('xterm');
      return {
        rows: parseInt((element.clientHeight - 0) / 18),
        cols: 10 // parseInt(element.clientWidth / 8)
      };
    },
    resizeTerm() {
      this.fitAddon.fit();
      this.term.scrollToBottom();
    },
    initSocket() {
      this.socket = new WebSocket(this.socketURI);
      this.socketOnClose();
      this.socketOnOpen();
      this.socketOnError();
      this.socketOnMessage();
    },
    socketOnOpen() {
      this.socket.onopen = () => {
        // 連接成功后
        this.initTerm()
      }
    },
    socketOnMessage() {
      this.socket.onmessage = (event) => {
        // 接收推送的消息
        this.term.write(event.data.toString());
      }
    },
    socketOnClose() {
      this.socket.onclose = () => {
        console.log('close socket')
      }
    },
    socketOnError() {
      this.socket.onerror = () => {
        console.log('socket error')
      }
    }
  }
}
</script>

<style scoped>
#xterm {
  padding: 15px 0;
}
</style>

3茬高、后端實現(xiàn)

前端主要依賴包:utf8 ssh2 ws兆旬,使用前請install。
ssh2用來實現(xiàn)nodejs和服務器進行連接和通信怎栽。
utf8用來實現(xiàn)服務器返回的命令執(zhí)行結果解碼丽猬。
ws用來實現(xiàn)后端和前端ws全雙工通信。

/**用來實現(xiàn)單個webssh功能**/
const utf8 = require("utf8");
const SSHClient = require("ssh2").Client;
const Server = require("ws").Server;
const wss = new Server({
  port: 2000
});

const serverInfo = {
  host: '192.168.18.141',
  port: 22,
  username: 'root',
  password: '密碼不告訴你.'
};

function createSocket(ws) {
  const ssh = new SSHClient();
  ssh
    .on("ready", function () {
      ws.send("\r\n*** SSH CONNECTION ESTABLISHED ***\r\n");
      ssh.shell(function (err, stream) {
        if (err) {
          return ws.emit("\r\n*** SSH SHELL ERROR: " + err.message + " ***\r\n");
        }
        ws.on("message", function (data) {
          stream.write(data);
        });
        ws.on("close", function () {
          console.log("close websocket熏瞄。");
          ssh.end();
        });
        stream
          .on("data", function (d) {
            let data = utf8.decode(d.toString("binary"));
            ws.send(data);
          })
          .on("close", function () {
            ssh.end();
          });
      });
    })
    .on("close", function () {
      ws.close();
    })
    .on("error", function (err) {
      console.log("\r\n*** SSH CONNECTION ERROR: " + err.message + " ***\r\n");
      ws.close();
    })
    .connect(serverInfo);
}

wss.on("connection", function (ws) {
  createSocket(ws);
});

4脚祟、遺留問題

1、瀏覽器resize后强饮,webshell窗口寬高自適應由桌、命令顯示的問題;
2邮丰、設置了cols或者fitAddon.fit(); 當一行字符超過80個后行您,會替換現(xiàn)在的內容問題。

5剪廉、友情鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末泉沾,一起剝皮案震驚了整個濱河市捞蚂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爆哑,老刑警劉巖洞难,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡队贱,警方通過查閱死者的電腦和手機色冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱嫌,“玉大人锋恬,你說我怎么就攤上這事”嗲穑” “怎么了与学?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘉抓。 經常有香客問我索守,道長,這世上最難降的妖魔是什么抑片? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任卵佛,我火速辦了婚禮,結果婚禮上敞斋,老公的妹妹穿的比我還像新娘截汪。我一直安慰自己,他們只是感情好植捎,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布衙解。 她就那樣靜靜地躺著,像睡著了一般焰枢。 火紅的嫁衣襯著肌膚如雪蚓峦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天医咨,我揣著相機與錄音枫匾,去河邊找鬼架诞。 笑死拟淮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的谴忧。 我是一名探鬼主播很泊,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沾谓!你這毒婦竟也來了委造?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤均驶,失蹤者是張志新(化名)和其女友劉穎昏兆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妇穴,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡爬虱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年隶债,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跑筝。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡死讹,死狀恐怖,靈堂內的尸體忽然破棺而出曲梗,到底是詐尸還是另有隱情赞警,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布虏两,位于F島的核電站愧旦,受9級特大地震影響,放射性物質發(fā)生泄漏定罢。R本人自食惡果不足惜忘瓦,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望引颈。 院中可真熱鬧耕皮,春花似錦、人聲如沸蝙场。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售滤。三九已至罚拟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間完箩,已是汗流浹背赐俗。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弊知,地道東北人阻逮。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像秩彤,于是被迫代替她去往敵國和親叔扼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容

  • 前言 最近由于項目需求漫雷,項目中需要實現(xiàn)一個WebSSH連接終端的功能瓜富,由于自己第一次做這類型功能,所以首先上了Gi...
    ObjectSpace閱讀 1,001評論 0 3
  • 為什么學習Python降盹? 通過什么途徑學習的Python与柑? 上網收集視頻,資料 關注公證號 買教程,書籍 Pyth...
    130920閱讀 1,210評論 0 0
  • 1价捧、談談對http協(xié)議的認識流程:1.域名解析域名解析檢查順序為:瀏覽器自身DNS緩存---》OS自身的DNS緩存...
    Zzmi閱讀 706評論 0 0
  • 今天感恩節(jié)哎每辟,感謝一直在我身邊的親朋好友。感恩相遇干旧!感恩不離不棄渠欺。 中午開了第一次的黨會,身份的轉變要...
    迷月閃星情閱讀 10,562評論 0 11
  • 彩排完椎眯,天已黑
    劉凱書法閱讀 4,212評論 1 3