Как подключить xterm.js (в электронном виде) к реальной рабочей командной строке?

Я зарылся в глубокую кроличью нору, пытаясь выяснить, о чем говорится в названии. Если вы не понимаете, что это за вопрос, я дам более подробное объяснение: вы когда-нибудь видели терминал VSCode? или Терминус? Ну, я хочу делать то, что делают эти приложения. У меня есть электронное приложение, и для удобства пользователей я хочу включить в него какую-то командную строку. Я просмотрел xterm.js, но могу найти только примеры таких вещей, как SSH, а не прямую ссылку на консоль, размещенную в системе. Я спрашиваю, как подключить xterm.js (в электронном виде) к реальной рабочей командной строке? Я видел программы, способные взаимодействовать с cmd.exe, такие как Windows Terminal. Я буду использовать его в качестве примера.

Изображение взято с сайта Process hacker

На приложенном фото вы можете увидеть три процесса. WindowsTerminal.exe, OpenConsole.exe и cmd.exe. Покопавшись в исходном коде Windows Terminal, я вижу, что OpenConsole.exe запускается с каждым созданным вами экземпляром cmd. Поэтому я предполагаю, что это программа, которая взаимодействует с cmd.exe. Теперь я знаю, что Windows Terminal сделан с использованием UWP, но вы можете видеть, что подобные вещи происходят с VSCode(Я открыл кучу терминалов для демонстрации)

вот еще одно сообщение с похожим вопросом, но без ответов. Я надеюсь, что этот набирает обороты.

Так что, если вы можете ответить, спасибо. Если вы немного отвлеклись, вспомните мой вопрос: Как подключить xterm.js(в электронном виде) к реальной рабочей командной строке?

Извините, если вы не поняли мою формулировку, я не очень хорош в этом: P


person Username 2020    schedule 13.08.2020    source источник
comment
Обновление для всех, кто заинтересован: я нашел пакет npm под названием node-pty, и я думаю, что я куда-то двигаюсь.   -  person Username 2020    schedule 13.08.2020
comment
Есть ли учебник для этого для веб-приложения?   -  person zero_cool    schedule 30.04.2021
comment
@zero_cool Веб-приложение сильно отличается от электронного приложения, потому что веб-приложения не имеют доступа к API node.js, что позволяет ему работать. Лучше всего заставить терминал работать в веб-браузере с ssh-соединением или вручную передавать пакеты с веб-сокетами на удаленный сервер.   -  person Username 2020    schedule 27.05.2021
comment
Веб-приложение определенно может отправлять запросы к API узла. Требуется ли другой тип доступа. Если я запускаю сервер узла на одном порту, я могу делать запросы к этому порту из пользовательского интерфейса веб-приложения (нажав кнопку отправки и т. д.)   -  person zero_cool    schedule 28.05.2021


Ответы (2)


Мне было полезно следующее видео. Вкратце вам необходимо:

  1. установить пакеты node-pty и electronic-rebuild (дополнительно к xterm)
  2. Поместите следующие коды в соответствующие файлы процесса

В основном процессе (main.js):

const os = require('os');
const pty = require('node-pty');

var shell = os.platform() === "win32" ? "powershell.exe" : "bash";
var ptyProcess = pty.spawn(shell, [], {
        name: 'xterm-color',
        cols: 80,
        rows: 24,
        cwd: process.env.HOME,
        env: process.env
    });
    
    ptyProcess.on("data", (data) => {
      mainWindow.webContents.send("terminal-incData", data);
    });

    ipcMain.on("terminal-into", (event, data)=> {
      ptyProcess.write(data);
    })

В процессе рендеринга:

const Terminal  =  require('xterm').Terminal;
const FitAddon = require('xterm-addon-fit').FitAddon;

const term = new Terminal();
const fitAddon = new FitAddon();
term.loadAddon(fitAddon);

// Open the terminal in #terminal-container
term.open(document.getElementById('terminal-container'));
term.onData(e => {
    ipcRenderer.send("terminal-into", e);
} );
ipcRenderer.on('terminal-incData', (event, data) => {
    term.write(data);
})

// Make the terminal's size and geometry fit the size of #terminal-container
fitAddon.fit();
  1. запустите команду electronic-rebuild, если вы получили сообщение об ошибке.

Вы можете получить следующие ошибки при попытке установить пакет electronic-rebuild:

В MAC: error: no template named 'remove_cv_t'. решение здесь

В Windows: gyp ERR! find Python решение здесь

person Orozbek Askarov    schedule 19.01.2021
comment
Ну, это... Интересно, это видео, которое помогло вам, было моим видео, которое я сделал после того, как нашел решение, тем не менее, я ценю время, которое вы потратили на этот пост, решения для распространенных ошибок и надстройку для терминала xterm. на. В любом случае спасибо. - person Username 2020; 24.01.2021
comment
лол, тогда спасибо. Ваше видео было действительно полезным. Удачи вашему каналу на YouTube. - person Orozbek Askarov; 25.01.2021

Я разобрался, код на github: https://github.com/77Z/electron-local-terminal-prototype

person Username 2020    schedule 14.08.2020
comment
Есть ли где-нибудь суть веб-приложения? - person zero_cool; 30.04.2021