我正在尝试构建一个节点应用程序,它将为我的手机提供远程接口。 这个想法是使用子进程来生成 shell。但我不明白如何提供密码输入并执行多步骤过程,例如重新设置 git repo 的基础。我的应用程序的主要重点是从手机远程管理文件和 git 存储库,但我遇到了 I/O 流问题。 我已附上与 shell 交互的最低限度的代码。
const {spawn} = require('child_process');
const express = require('express');
const bodyParser = require('body-parser');
const {WebSocketServer} = require('ws');
const app = express();
const process = require('process');
const port = 3000;
const host = '127.0.0.1';
app.use(bodyParser.json());
let commandQueue = [];
let currentChildProcess = null;
let clients = [];
let currentPty = null;
function startNextProcess() {
if (commandQueue.length > 0 && !currentChildProcess) {
const command = commandQueue.shift();
const baseCommand = "cd '/mnt/c/Users/John/MyDocuments/NodePlayground'";
const fullCommand = `${baseCommand} && ${command}`;
currentChildProcess = spawn(fullCommand, {shell: true,stdio:"overlapped"});
let stdoutData = '';
let stderrData = '';
currentChildProcess.stdout.on('data', (data) => {
stdoutData += data.toString();
clients.forEach((client) => {
client.send(stdoutData);
});
});
currentChildProcess.stderr.on('data', (data) => {
stderrData += data.toString();
clients.forEach((client) => {
client.send(stderrData);
});
});
currentChildProcess.on('close', (code) => {
console.log(`child process exited with code ${code}`);
console.log(`stdout: ${stdoutData}`);
console.log(`stderr: ${stderrData}`);
currentChildProcess = null;
startNextProcess();
});
}
}
const server = app.listen({port:port,host:host}, () => {
console.log(`Server started at http://localhost:${port}`);
});
const wss = new WebSocketServer({server:server,clientTracking: true});
function messageHandler(message) {
//console.log(`Received message => ${message}`);
const json = JSON.parse(message.toString());
const command = json.command;
if(json.type==='start'){
commandQueue.push(command);
startNextProcess();
}else{
currentChildProcess.stdin.write(command);
currentChildProcess.stdin.write('\n');
}
this.send('Command received');
}
wss.on('connection', (ws) => {
clients.push(ws);
ws.on('message', messageHandler);
ws.send('Hello! Message From Server!!');
});
我做了一些与 Vercel 的构建容器交互的东西。可以执行您提到的任务。
它使用 http 和 websockets。
但是,由于http连接是无状态的,所以我必须做管道和做命令分离来执行一系列任务。 如果您使用 websockets,则不需要它。
给你: GitHub