Jump to Navigation

通过http实现简单的远程shell访问代理

当机器处理不同局域网时,如果希望能够互通,一种常用的也比较可靠的方式是使用vpn。
如果是自己搭建私有vpn,则需要一台可控的公网IP服务器。
在没有这些资源的情况下,希望机器的互通比较困难。

在此,给出一种并非完全的互通方式,可以实现单向的远程shell命令执行方式。
这种方式能执行另一局域网中机器的命令,实现简单的类似远程登陆管理的功能。
这就是使用http实现的远程shell访问代理。

实现逻辑为,
在一台有公网访问的http服务器上安装一个像php一类的脚本程序,
该脚本程序分服务端模式与客户端模式。
服务模式下,脚本程序不断轮循命令记录数据库表,查找需要远程执行的下一条命令记录,
并把查找到的命令记录依次输出到访问该脚本的客户端组件。
客户端模式下,脚本程序不断轮循命令响应数据库表,查找需要返回的已经执行完的下一条命令行输出,
并把查找到的命令行输出记录输出到访问该脚本的客户端组件。

除了安装在公网http服务器上的脚本程序,
需要在被访问的局域网内的机器上安装一个shell命令执行代理程序,
该程序启动时主动发起连接到公网http服务器上的脚本程序的服务端的请求,
并下载需要执行的下一条命令,通过在子进程内的bash程序执行该命令,
捕获命令输出并发送到http服务器上对应的命令输出表中。

在发起命令执行请求的局域网机器上安装一个发起shell命令的程序,
该程序启动时等待用户输入命令,如果有命令输入,
则把该命令发送到http服务器的命令记录表中。
然后主动发起连接到http服务器上的客户端模式程序上,等待这条命令的执行与输出结果,
并下载下来,显示到本地控制台,从而完成一条命令的远程执行功能。

优点,
这种实现方式,对资源要求相对简单。像对http服务器的要求,现在的云服务的免费版本都能支持的了。
缺点,
逻辑上复杂,不能完全模式真实控制台。
有响应时间延迟。

说明,
这种方式的原理是,把被访问端的被动接收访问请求,转换为了主动发起一些请求,从而完成获取相关访问信息的功能。
由于http脚本程序一般都有执行时长的限制,shell命令执行代理程序需要支持连接中断这类情况。
在实际的开发测试中,安装在http服务器上的命令路由程序,使用了类似comet的long poll模式的comet服务。
这样的话,被请求端的 shell代理能在尽量少的连接的情况下,尽量可能快速实时的获取下一条需要执行的命令。
同样,在shell命令发起端程序中也合作相同的comet模式,尽量实时的获取命令的下一条输出。
经过测试,这种模式能实现执行时间远超过http脚本程序执行时间的命令,像测试过一个编译程序的过程,
一次make命令可能要执行20-30分钟,客户端仍旧能持续不断连接到http服务器上的脚本程序,
接收make命令的大量输出。
在实际实现的过程中,并不是把一个命令的所有输出结果一次返回,而是shell命令执行代理程序分作多次提交到http服务器上,
再由shell命令发起端持续不断获取并输出到本地控制台上,达到尽量能够模拟真实执行效果的目标。
但由于毕竟中间有一些轮循操作,中间可能有等待时延,命令的输出响应并非完全实时,
其实时性取决于轮循的时间间隔,这需要在实际使用时调整到一个适当的值,让http服务器的访问压力不至于太大。
由于一般web server和php都开启了输出缓存功能,这里使用限制并小包长度的方式,强制缓存更实时推送到客户端。

目前已经实现的功能,
可完成命令的远程执行功能(命令的执行有结束时间,而不会像有些daemon程序一样永远不完成)
实时性达到0.2秒。
能够控制每次输出的的结果仅为本次命令的结果。
仅支持一个shell命令执行代理程序。
可支持多个shell命令发起程序发起不同的命令。
现在的原型程序使用php语言开发。

需要完善的功能,
多shell命令执行代理程序。(类似本地多shell控制台功能)
连接到特定的shell命令执行代理的会话功能。(类似本地的shell控制台切换功能)
命令中断取消功能。
不同局域网机器切换功能。(类似连接到不同机器执行命令)
支持更真实模拟本地shell的pty的程序,像vim这种即时交互的命令。
加密传输功能。
shell命令执行代理连接到真实的ssh服务的功能。
修复一些细节问题,防止shell命令执行代理程序不工作的问题。

后续再整理一下实现代码,发布出来供参考。
补充设计图与时序图,进一步补充完善这个程序的相关说明。

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut