通过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
|