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

发布: 2014-03-26 10:55

当机器处理不同局域网时,如果希望能够互通,一种常用的也比较可靠的方式是使用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命令执行代理程序不工作的问题。

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



原文: http://qtchina.tk/?q=node/796

Powered by zexport