通过TCP请求在远程服务器上打开终端/外壳

时间:2019-05-16 18:56:17

标签: node.js bash http

我有这个:

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 /提示?

4 个答案:

答案 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代码对这些程序也有自己的识别,即使没有更改。