返回顶部
首页 > 资讯 > 精选 >node.js怎么实现伪终端
  • 707
分享到

node.js怎么实现伪终端

2023-07-04 16:07:14 707人浏览 安东尼
摘要

这篇“node.js怎么实现伪终端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js怎么实现伪终端”文章吧。伪终端

这篇“node.js怎么实现伪终端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js怎么实现伪终端”文章吧。

伪终端

伪终端不是真正的终端,而是内核提供的一个“服务”。终端服务通常包括三层:

最顶层提供给字符设备的输入输出接口中间层的线路规程(line discipline)底层的硬件驱动

其中,最顶层的接口往往通过系统调用函数实现,如(read,write);而底层的硬件驱动程序则负责伪终端的主从设备通信,它由内核提供;线路规程看起来则比较抽象,但是实际上从功能上说它负责输入输出信息的“加工”,如处理输入过程中的中断字符(ctrl + c)以及一些回退字符(backspace 和 delete)等,同时转换输出的换行符n为rn等。

一个伪终端分为两部分:主设备和从设备,他们底层通过实现默认线路规程的双向管道连接(硬件驱动)。伪终端主设备的任何输入都会反映到从设备上,反之亦然。从设备的输出信息也通过管道发送给主设备,这样可以在伪终端的从设备中执行shell,完成终端的功能。

伪终端的从设备中,可以真实的模拟终端的tab补全和其他的shell特殊命令,因此在node原生模块不能满足需求的前提下,我们需要把目光放到底层,看看OS提供了什么功能。目前,glibc库提供了posix_openpt接口,不过流程有些繁琐:

使用posix_openpt打开一个伪终端主设备 grantpt设置从设备的权限 unlockpt解对应的从设备获取从设备名称(类似 /dev/pts/123)主(从)设备读写,执行操作

因此出现了封装更好的pty库,仅仅通过一个forkpty函数便可以实现上述所有功能。通过编写一个node的c++扩展模块,搭配pty库实现一个在伪终端从设备执行命令行的terminal。

关于伪终端安全性的问题,我们在文章的最后在进行讨论。

伪终端实现思路

根据伪终端的主从设备的特性,我们在主设备所在的父进程中管理伪终端的生命周期及其资源,在从设备所在的子进程中执行shell,执行过程中的信息及结果通过双向管道传输给主设备,由主设备所在的进程向外提供stdout。

在此处借鉴pty.js的实现思路:

pid_t pid = pty_forkpty(&master, name, NULL, &winp); switch (pid) { case -1:  return Nan::ThrowError("forkpty(3) failed."); case 0:  if (strlen(cwd)) chdir(cwd);  if (uid != -1 && gid != -1) {  if (setgid(gid) == -1) {   perror("setgid(2) failed.");   _exit(1);  }  if (setuid(uid) == -1) {   perror("setuid(2) failed.");   _exit(1);  }  }  pty_execvpe(argv[0], argv, env);  perror("execvp(3) failed.");  _exit(1); default:  if (pty_nonblock(master) == -1) {  return Nan::ThrowError("Could not set master fd to nonblocking.");  }  Local<Object> obj = Nan::New<Object>();  Nan::Set(obj,  Nan::New<String>("fd").ToLocalChecked(),  Nan::New<Number>(master));  Nan::Set(obj,  Nan::New<String>("pid").ToLocalChecked(),  Nan::New<Number>(pid));  Nan::Set(obj,  Nan::New<String>("pty").ToLocalChecked(),  Nan::New<String>(name).ToLocalChecked());  pty_baton *baton = new pty_baton();  baton->exit_code = 0;  baton->signal_code = 0;  baton->cb.Reset(Local<Function>::Cast(info[8]));  baton->pid = pid;  baton->async.data = baton;  uv_async_init(uv_default_loop(), &baton->async, pty_after_waitpid);  uv_thread_create(&baton->tid, pty_waitpid, static_cast<void*>(baton));  return info.GetReturnValue().Set(obj); }

以上就是关于“node.js怎么实现伪终端”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: node.js怎么实现伪终端

本文链接: https://lsjlt.com/news/346506.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • node.js怎么实现伪终端
    这篇“node.js怎么实现伪终端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js怎么实现伪终端”文章吧。伪终端...
    99+
    2023-07-04
  • node.js怎么实现支持多用户web终端
    这篇文章主要介绍“node.js怎么实现支持多用户web终端”,在日常操作中,相信很多人在node.js怎么实现支持多用户web终端问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node.js怎么实现支持多用...
    99+
    2023-07-04
  • Node.js中readline模块实现终端输入
    目录1 概述2 readline的使用3 示例1:输入输出4 示例2:模拟命令行的输入输出1 概述 readline是Node.js里实现标准输入输出的封装好的模块,通过这个模块我们...
    99+
    2024-04-02
  • node.js怎么支持多用户web终端
    这篇文章主要介绍“node.js怎么支持多用户web终端”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node.js怎么支持多用户web终端”文章能帮助大家解决问题。terminal(命令行)作为本...
    99+
    2023-06-17
  • Node.js中如何使用readline模块实现终端输入
    本文小编为大家详细介绍“Node.js中如何使用readline模块实现终端输入”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js中如何使用readline模块实现终端输入”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-29
  • Linux的终端与进程怎么实现
    这篇文章主要介绍“Linux的终端与进程怎么实现”,在日常操作中,相信很多人在Linux的终端与进程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的终端与进程怎么实现”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • node.js支持多用户web终端实现及安全方案
    terminal(命令行)作为本地IDE普遍拥有的功能,对项目的git操作以及文件操作有着非常强大的支持。对于WebIDE,在没有web伪终端的情况下,仅仅提供封装的命令行接口是完全不能满足开发者使用,因此...
    99+
    2022-06-04
    终端 多用户 方案
  • Tmux中怎么实现多会话终端管理
    本篇文章为大家展示了Tmux中怎么实现多会话终端管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux 下安装 tmuxTmux 可以在绝大多数的 Linux 官方仓库下获取。在 Arch L...
    99+
    2023-06-15
  • Node.js中怎么实现http请求客户端
    这期内容当中小编将会给大家带来有关Node.js中怎么实现http请求客户端,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Node.JS有一个request模块,可以很方...
    99+
    2024-04-02
  • node.js实现端口转发
    本文为大家分享的是node.js端口转发实现代码,供大家参考,具体内容如下 #!/sbin/node var net = require('net'); function proxyPort(s...
    99+
    2022-06-04
    端口 node js
  • 如何实现Linux终端美化
    这篇文章主要介绍“如何实现Linux终端美化”,在日常操作中,相信很多人在如何实现Linux终端美化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现Linux终端美化”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-12
  • PHP中怎么实现伪静态
    这期内容当中小编将会给大家带来有关PHP中怎么实现伪静态,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码:<php //伪静态方法一   // l...
    99+
    2023-06-17
  • python怎么进入终端
    在 python 中有两种方式可以访问终端:使用 os.system() 函数执行系统命令,直接进入终端。使用 pty(伪终端),创建一个伪终端,提供与实际终端类似的访问权限。 如何使...
    99+
    2024-05-14
    linux python macos
  • python 实现终端中的进度条
    # -*- coding:utf-8 -*-   # Copyright: Lustralisk # Author: test # Date: 2015-11-08   import sys, time   class ProgressBa...
    99+
    2023-01-31
    终端 进度条 python
  • 怎么用Shell脚本实现关闭多余的tty终端
    这篇文章主要讲解了“怎么用Shell脚本实现关闭多余的tty终端”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Shell脚本实现关闭多余的tty终端”吧!系统:centos 6关闭tt...
    99+
    2023-06-09
  • Node.js OAuth:实现安全认证的终极指南
    Node.js OAuth 简介 OAuth (开放授权) 是一种授权机制,允许用户授权第三方应用程序访问其私人资源,而无需向第三方应用程序披露其密码。这使得 OAuth 成为一种安全可靠的方法,可让您将第三方身份验证集成到您的应用程序...
    99+
    2024-02-11
    Node.js OAuth 身份验证 安全 第三方集成
  • MYSQL中怎么实现伪行级锁
    本篇文章给大家分享的是有关MYSQL中怎么实现伪行级锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 一.数据准备mysql>...
    99+
    2024-04-02
  • python实现简易聊天室(Linux终端)
    本文实例为大家分享了python实现简易聊天室的具体代码,供大家参考,具体内容如下 群聊聊天室 1.功能:类似qq群聊功能 有人进入聊天室需要输入姓名,姓名不能重复 有人进入聊天室,其他人会受到通知 xxx进入...
    99+
    2022-06-02
    python 聊天室
  • 如何编写实现shell终端代码
    本篇内容主要讲解“如何编写实现shell终端代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何编写实现shell终端代码”吧!代码如下:#include"apue.h"i...
    99+
    2023-06-09
  • Linux安装怎么Terminus终端
    这篇“Linux安装怎么Terminus终端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux安装怎么Terminus...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作