我有这个:
const http = require('http');
const cp = require('child_process');
const server = http.createServer((req,res) => {
const bash = cp.spawn('bash');
req.pipe(bash.stdin, {end:false);
bash.stdout.pipe(res);
bash.stderr.pipe(res);
});
server.listen('4004');
当我用以下命令访问服务器时:
curl localhost:4004
然后我输入bash命令,什么都没有输出到我的控制台,有人知道为什么吗?
注意:为了提高安全性,我计划在docker容器中运行此安全性,使用https / ssl并实施身份验证(有关身份验证方案lmk的任何建议)。
更重要的是,我正在寻找 shell提示出现...显然bash本身不能打开shell /提示?
答案 0 :(得分:1)
这是部分答案,但是我开始赏金,因为我正在寻找更好的东西。我能够使用TCP创建基本的东西,如下所示:
const net = require('net'); // !use net package not http
const cp = require('child_process');
const server = net.createServer(s => {
const bash = cp.spawn('bash');
s.pipe(bash.stdin, {end:false});
bash.stdout.pipe(s);
bash.stderr.pipe(s);
});
server.listen('4004');
不确定为什么它不能与HTTP一起使用。我使用netcat连接到它:
nc localhost 4004
但这不是打开终端,只是一个bash进程。体验并不理想,如下所述: https://unix.stackexchange.com/questions/519364/bash-shell-modes-how-to-pipe-request-to-shell-on-remote-server
无论如何,我想复制您在执行类似操作时的shell体验:
docker exec -ti <container> /bin/bash
当我运行 my 脚本时,它可以“运行”,但是我不得到任何 shell提示或类似的东西。 (解决此问题的一种方法可能是使用ssh,但我正在尝试找出另一种方法)。
答案 1 :(得分:1)
可以这么说是可以通过网络进行的。但是,您的方法行不通,因为您混合了范式(批处理与交互式),并且缺少运行终端应用程序所需的大量设置。
通常,我将向您展示如何进行编程,但是,这确实涉及其中。看看:
https://github.com/chjj/tty.js
和
https://github.com/xtermjs/xterm.js
作为创建解决方案的起点。
两者都可以直接从node.js中使用,以通过HTTP服务终端应用程序。
答案 2 :(得分:0)
您可以使用telnet连接到http服务器。这取决于您如何启动http服务器。这是一个例子
使用npm软件包http-server启动http服务器
const styles = (theme: Theme) => createStyles({
appBar: {
backgroundColor: theme.palette.background.default,
height: '48px',
'&:before': {
content: "",
position: 'absolute',
left: '2.5%',
bottom: 0,
right: '2.5%',
width: '95%',
borderBottom: '1px solid magenta',
}
}
});
现在分别启动telnet会话
npm install -g http-server
cd ~/ <Any directory>
http-server
OR
telnet localhost 8080
然后输入类似GET /
使用telnet客户端代替nc
检查以下内容:https://www.the-art-of-web.com/system/telnet-http11/ 更新:通过nodejs运行ssh服务器。它允许您运行SSH服务器 我在https://github.com/mscdex/ssh2
找到了nc localhost 8080
答案 3 :(得分:0)
您的方法很复杂,但是,当您最终连接到远程服务器时,请不要使用“ bash”作为开始连接的方法,BASH只是带有其他命令和内容的外壳而已, >
请使用以下某些程序的命令行名称:即:
~ $ 'gnome-terminal'
~ $ 'xterm'
现在,您将在系统中引用一个真实的程序,即使内核级C代码对这些程序也有自己的识别,即使没有更改。