我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react express实现webssh demo解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react express实现webssh demo解析

正文

 下面是一个简单的 WebSSH Demo,实现了通过浏览器连接 SSH 服务器并进行交互的功能。

实现 WebSSH 的基本思路

WebSSH 可以分成以下几个模块:

  • 前端界面:使用 xterm.js 实现一个基于浏览器的终端界面。
  • WebSocket 连接:使用 WebSocket 连接连接 WebSSH 服务器后端。
  • SSH 连接:使用 ssh2.js 库连接 SSH 服务器,然后在 WebSocket 和 SSH 之间建立一个双向通讯。

实现 Demo 的代码

服务器端代码

服务器端代码使用 Node.js 和 WebSocket 模块实现,主要用于连接到远程 SSH 服务器并与前端建立 WebSocket 连接。

const SSHClient = require('ssh2').Client;
const utf8 = require('utf8');
export const createNewServer = (machineConfig: any, socket: any) => {
  const ssh = new SSHClient();
  const { host, username, password } = machineConfig;
  // 连接成功
  ssh.on('ready', function () {
    socket.send('\r\n*** SSH CONNECTION SUCCESS ***\r\n');
    ssh.shell(function (err: any, stream: any) {
      // 出错
      if (err) {
        return socket.send('\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n');
      }
      // 前端发送消息
      socket.on('message', function (data: any) {
        stream.write(data);
      });
      // 通过sh发送消息给前端
      stream.on('data', function (d: any) {
        socket.send(utf8.decode(d.toString('binary')));
        // 关闭连接
      }).on('close', function () {
        ssh.end();
      });
    })
    // 关闭连接
  }).on('close', function () {
    socket.send('\r\n*** SSH CONNECTION CLOSED ***\r\n');
    // 连接错误
  }).on('error', function (err: any) {
    socket.send('\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n');
    // 连接
  }).connect({
    port: 22,
    host,
    username,
    password
  });
}

前端代码

前端代码主要包括一个包装 xterm.js 的 React 组件和一些 WebSockets 相关的代码。

import React, { useEffect, useRef } from 'react';
import { Terminal } from 'xterm';
import { WebLinksAddon } from 'xterm-addon-web-links';
import { FitAddon } from 'xterm-addon-fit';
import 'xterm/css/xterm.css';
const FontSize = 14;
const Col = 80;
const WebTerminal = () => {
  const webTerminal = useRef(null);
  const ws = useRef(null);
  useEffect(() => {
    // 初始化终端
    const ele = document.getElementById('terminal');
    if (ele && !webTerminal.current) {
      const height = ele.clientHeight;
      // 初始化
      const terminal = new Terminal({
        cursorBlink: true,
        cols: Col,
        rows: Math.ceil(height / FontSize),
      });
      // 辅助
      const fitAddon = new FitAddon();
      terminal.loadAddon(new WebLinksAddon());
      terminal.loadAddon(fitAddon);
      terminal.open(ele);
      terminal.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ');
      fitAddon.fit();
      webTerminal.current = terminal;
    }
    // 初始化ws连接
    if (ws.current) ws.current.close();
    const socket = new WebSocket('ws://localhost:3001');
    socket.onopen = () => {
      socket.send('connect success');
    };
    ws.current = socket;
  }, []);
  useEffect(() => {
    // 新增监听事件
    const terminal = webTerminal.current;
    const socket = ws.current;
    if (terminal && socket) {
      // 监听
      terminal.onKey(e => {
        const { key } = e;
        socket.send(key);
      });
      // ws监听
      socket.onmessage = e => {
        console.log(e);
        if (typeof e.data === 'string') {
          terminal.write(e.data);
        } else {
          console.error('格式错误');
        }
      };
    }
  }, []);
  return <div id="terminal"  style={{ backgroundColor: '#000', width: '100vw', height: '100vh' }}/>;
};
export default WebTerminal;

WebSSH 组件借助 Hooks 特性进行 WebSocket 和 xterm.js 的初始化。具体来说,这个组件使用了 useEffect Hook 在组件挂载时完成以下工作:

  • 初始化 Terminal 组件。
  • 初始化 WebSocket 连接。
  • 为 Terminal 组件绑定输入事件和 WebSocket 发送数据的逻辑。

在 React 应用中使用 WebSSH 组件

你需要在你的 React的index.js 文件中引入 WebSSH 组件,并在你的应用中渲染它:

import WebSSH from './components/WebSSH';
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
  <WebSSH />,
  document.getElementById('root')
);

效果

编辑

总结

在本篇博客中,我们学习了如何使用 xterm.js、WebSocket 和 ssh2.js 库构建一个 WebSSH 应用程序。我们创建了一个简单的 Demo 来演示该过程。

完整代码参考

GitHub - judithhuang/webssh-demo

以上就是react express实现webssh demo解析的详细内容,更多关于react express实现webssh的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react express实现webssh demo解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

react express实现webssh demo解析

这篇文章主要为大家介绍了详解react express实现webssh demo解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-14

react express怎么实现webssh demo解析

本篇内容介绍了“react express怎么实现webssh demo解析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现 WebSSH
2023-07-05

如何实现react显示文件上传进度demo

这篇文章给大家分享的是有关如何实现react显示文件上传进度demo的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。在
2023-06-14

Nodejs中Express 常用中间件 body-parser 实现解析

写在前面 body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析。使用非常简单,以下两行代码已经覆盖了大部分的使用场景。app.use(bodyParser.json()); app.use(bod
2022-06-04

react源码层深入刨析babel解析jsx实现

同作为MVVM框架,React相比于Vue来讲,上手更需要JavaScript功底深厚一些,本系列将阅读React相关源码,从jsx->VDom->RDOM等一些列的过程,将会在本系列中一一讲解
2022-11-13

uni-app结合PHP实现单用户登陆demo及解析

Uni-App与PHP单用户登录通过将Uni-App跨平台框架与PHP后端相结合,可以实现单用户登录。本文提供了一个分步指南,演示如何创建PHP登录后端、配置Uni-App客户端、进行客户端登录和身份验证,以及提供示例代码。通过此方法,用户可以安全地登录Uni-App应用程序,访问受保护资源并保持登录状态。
uni-app结合PHP实现单用户登陆demo及解析
2024-04-25

uni-app结合PHP实现单用户登陆demo及解析

这篇文章主要为大家介绍了uni-app结合PHP实现单用户登陆示例过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-20

Android手机端小米推送Demo解析和实现方法

最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记。到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验。推送 由于最近项目要用到Android的消息推送,关于Android推送的解决方案有
2022-06-06

怎样实现对VS2005 Express功能的分析

本篇文章给大家分享的是有关怎样实现对VS2005 Express功能的分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。微软官网对技术人员进行研究表示,许多使用VS2005 E
2023-06-17

Canvas实现二娃翠花回家之路小游戏demo解析

这篇文章主要为大家介绍了Canvas实现二娃翠花回家之路小游戏demo解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-15

Python Flask框架开发之运用SocketIO实现WebSSH方法详解

PythonFlask框架开发之运用SocketIO实现WebSSH方法详解利用SocketIO在Flask框架下实现WebSSH功能,实时连接Web应用程序和客户端,允许服务器推送和接收事件。本指南详细介绍了安装、配置和使用SocketIO,以及示例代码来构建WebSSH页面和处理SocketIO事件。通过本教程,开发者可以轻松在PythonFlask应用程序中集成WebSSH。
Python Flask框架开发之运用SocketIO实现WebSSH方法详解
2024-04-23

Android 实现单指滑动双指缩放照片demo及过程解析

这篇文章主要为大家介绍了Android 实现单指滑动双指缩放照片demo及过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

react常见的ts类型实践解析

这篇文章主要为大家介绍了react常见的ts类型实践解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

JavaScript实现类似Express的中间件系统(实例详解)

在Express中可以给一个请求设置若干个中间件,在处理响应时会按顺序执行这些中间件,正在执行的中间件可以控制是否执行下一个中间件,这篇文章主要介绍了JavaScript实现类似Express的中间件系统的相关资料,需要的朋友可以参考下
2023-02-14

编程热搜

目录