基于I/O缓冲区读写的控制台远程交互模型

2013-09-29 05:20宋宇波蓝智灵
计算机工程 2013年1期
关键词:命令行缓冲区命令

唐 磊,宋宇波,蓝智灵

(东南大学信息科学与工程学院,南京 210096)

1 概述

近年来,随着计算机技术的不断发展,通过网络远程交互以运行各种应用或服务程序,人们可以更方便安全地实现远程办公等工作[1],具有巨大的市场前景。在现有计算机操作系统中,Microsoft公司的Windows系统因其卓越的易用性和绚丽的视觉效果成为计算机系统中大众用户的首选。Windows系统主要提供了2种与系统交互的方式:可视化操作和命令行操作。

基于可视化操作,Windows系统提供了如远程桌面连接等途径[2],远程桌面连接基于远程桌面协议(Remote Desktop Protocol, RDP)[3]。为了保障通信数据的安全,可以采用SSL-VPN进行加密处理[4-5]。

而在命令行操作方面,现有的实现命令行操作的常规方法主要是将控制台程序窗口的标准输入输出重定向到其父进程的发送/接收管道上[6],或者是重定向到用于远程通信的基于TCP/IP协议的套接字上[7]。由于一些系统安防软件会对系统中程序标准输入输出的重定向进行审核,因此该方法与这些安防软件的兼容性较差,会使其产生误报或者误删等错误操作,从而影响整个系统的稳定性。于此同时,由于系统自带的常用控制台程序只能用于本机操作,没有添加远程通信的模块,为了将控制台程序用于远程交互,需要修改程序源代码,在程序中添加与远程通信的接口。该方法无法适用于已经成型的控制台程序,即对于控制台程序的向下兼容性较差。

针对以上问题,本文提出一种控制台远程交互模型,并设计一种控制台程序加载器。

2 控制台远程交互

控制台程序是Windows为了兼容DOS程序而设立的没有独立窗口的程序,一般在命令行下(cmd.exe)运行。控制台程序的输入输出是通过标准I/O进行的,不像界面程序可以通过鼠标点击进行操作。一般后台运行的程序可作为控制台程序。

控制台I/O缓冲区包括输入缓冲区和输出缓冲区(屏幕缓冲区)。输入缓冲区能够存储输入记录序列,该序列中包含了各种输入事件的信息,如键盘事件和鼠标事件等;输出缓冲区是控制台窗口的一个二维的字符数组和彩色数据,即屏幕中的文本和背景颜色属性等信息。

所谓远程交互,是指用户在异地通过网络与本地计算机通信[8]。随着网络的高速发展,电脑远程交互技术越来越引起人们的关注。目前远程交互的主要应用包括远程办公、远程教育、远程维护和远程协助等。

3 远程交互模型分析

为了更好地实现对系统安防软件的兼容性,以及实现对控制台程序良好的兼容性,本文提出一种新型的基于I/O缓冲区读写的控制台程序远程交互模型。该模型克服现有解决方案中容易与系统软件冲突导致系统不稳定的不足,并且为了增强对控制台程序的兼容性,提出了一种全新的架构。在保证控制台程序完整性的前提下,为控制台程序提供了一个加载器,如图1所示。

图1 远程交互模型拓扑图

该加载器作为控制台程序的父进程,采用模拟键盘输入到窗口输入缓冲区的方式作为控制台窗口的输入,并通过获取控制台窗口的输出缓冲区数据得到输出。由加载该控制台程序的父进程与其进行交互,父进程通过 Windows套接字(Winsock)与远程用户进行命令和数据的传输,从而实现对控制台程序的远程交互。

3.1 远程交互模型的结构

该模型的远程交互包括以下组件:远程主机接入端和本地控制台程序加载器;远程主机接入端与本地控制台程序加载器通过互联网或局域网(有线或者无线)相互通信。

远程主机接入端具体包括人机交互模块和远程通信模块;2个功能模块在远程主机系统中运行。当人机交互模块接收到用户的命令时,将命令转发给远程通信模块,远程通信模块将命令通过网络发送给本地控制台程序加载器;当远程通信模块收到本地控制台程序加载器发送的回显数据时,将数据转发给人机交互模块,人机交互模块再将数据显示给用户。

本地控制台程序加载器具体包括本地通信模块和控制台交互模块;2个功能模块在本地主机系统中运行。当本地通信模块收到命令后,将命令转发给控制台交互模块,控制台交互模块将命令作为控制台程序命令行窗口的输入传递给控制台程序;当控制台交互模块获取到控制台程序命令行窗口的回显数据时,将数据转发给本地通信模块,本地通信模块再将回显数据通过网络发送给远程主机接入端。图2为该模型结构及模块间连接关系示意图。

图2 远程交互模型结构及模块间连接关系示意图

如图2所示,该模型远程交互流程如下:

(1)本地控制台程序加载器初始化,等待远程主机接入端的连接。

(2)远程主机接入端初始化,与本地控制台程序加载器建立连接,做好通信准备。

(3)用户对远程主机接入端进行配置,输入控制命令。

(4)远程主机接入端接收到用户命令,将命令通过网络发送给本地控制台程序加载器。

(5)本地控制台程序加载器接收到命令数据,将命令通过模拟键盘输入的方式作为控制台程序命令行窗口的输入数据传递给控制台程序。

(6)当控制台程序处理完命令输出回显数据时,本地控制台程序加载器从控制台程序命令行窗口的输出缓冲区获取到回显数据,并将数据通过网络发送给远程主机接入端。

远程主机接入端接收到回显数据,通过人机交互模块显示给用户。

3.2 加载器交互模块分析

图3为加载器中控制台交互模块流程。

图3 加载器交互模块流程

如图3所示,在与控制台程序的命令行窗口交互前,加载器的控制台交互模块先进行初始化,创建用于处理控制台程序命令行窗口输入输出的2个线程。成功创建线程后,创建控制台程序子进程。创建成功后,将本地控制台程序加载器(父进程)的命令行窗口附着到控制台程序的命令行窗口上。加载器接收到命令后,输入线程通过模拟键盘输入到窗口输入缓冲区的方式将命令输入到控制台程序的命令行窗口,控制台程序处理完命令后,加载器的输出线程从命令行窗口输出缓冲区中获取到回显数据,再将数据发送给远程主机接入端。当加载器的输入线程收到的是终止命令时,本地控制台程序加载器终止输入输出双线程,然后结束控制台程序子进程和自身进程。

3.3 加载器交互模块具体实施方案

结合图2对该模型中的关键技术进行详细实例说明。网络环境:互联网/局域网;硬件设备:2台 PC机;运行平台:Windows XP;控制台程序:cmd.exe。

如图2所示,模型中的远程主机接入端运行在一台远程PC机上,它的作用是通过人机交互模块接收用户输入的命令,使用远程通信模块,将命令经由网络发送给本地控制台程序加载器。本地控制台程序加载器通过本地通信模块接收远程主机接入端发送的命令,将命令由控制台交互模块作为命令行窗口的输入传给控制台程序;控制台程序处理完相应命令后,向命令行窗口输出回显数据,本地控制台程序加载器的控制台交互模块从控制台程序的命令行窗口输出缓冲区中获取回显数据,再将回显数据通过本地通信模块由网络发送给远程主机接入端。远程主机接入端通过远程通信模块接收回显数据,再将回显数据通过人机交互模块显示给用户。

下面介绍在 Windows环境下加载器控制台交互模块的具体实施方法。Microsoft的 Windows系统提供一整套API函数库方便编程人员进行二次开发。如图3所示,具体步骤如下:

(1)加载器控制台交互模块先进行初始化,并调用函数创建用于传递命令行窗口输入输出数据的I/O双线程。

(2)调用函数,创建控制台程序进程(cmd子进程)。

(3)调用函数,将本地控制台程序加载器的命令行窗口附着在cmd子进程的命令行窗口上。这样做的结果是本地控制台程序加载器的命令行窗口的输入会成为cmd子进程窗口的输入,cmd子进程窗口的输出会成为本地控制台程序加载器的命令行窗口的输出。因此,只需要操作本地控制台程序加载器的命令行窗口,就可以实现与cmd子进程命令行窗口的交互。

(4)当加载器控制台交互模块收到远程发送来的用户命令时,如果是退出命令,则控制台交互模块终止I/O双线程,然后退出自身程序。

(5)如果不是退出命令,输入线程调用函数,打开“CONIN$”,即 cmd子进程命令行窗口的输入缓冲区,结构INPUT_RECORD描述了命令行窗口输入缓冲区的一个输入事件[9],键盘的一次按键的事件可以存储的一个INPUT_RECORD结构中,因此,将输入命令的字符存储在INPUT_RECORD结构数组中,调用函数将命令输入到命令行窗口中,即模拟键盘输入的技术。

(6)当 cmd子进程命令行窗口产生回显数据时,输出线程调用函数,打开“CONOUT$”,即 cmd子进程命令行窗口的输出缓冲区,调用函数,获取cmd子进程命令行窗口的大小(宽高)[10],根据大小确定一次从输出缓冲区中读取的字符数,再调用函数,从输出缓冲区中读取相应的字符。

4 模型测试结果分析

4.1 系统软件兼容性

为了测试该模型对系统安防软件的兼容性,针对目前主流的安防软件分别搭建了相应的测试平台,包括 360杀毒/安全卫士、卡巴斯基 2011Kav、NOD32和诺顿2011。测试结果如表1所示。

表1 系统安防软件兼容性测试结果

从表1可以看出,基于控制台程序窗口标准输入输出重定向的方式会使安防软件产生误报或者误删等错误操作,兼容性较差,影响系统的稳定性;基于控制台程序窗口I/O缓冲区读写的方式能够有效避免安防软件的误报和误删,提高了系统的稳定性,保证了与系统安防软件的兼容性。

4.2 控制台程序兼容性

为了测试该模型对控制台程序的兼容性,针对目前常用的控制台程序搭建了相应的测试平台,包括cmd.exe、ipconfig.exe、telnet.exe、ftp.exe、nslookup.exe、NetCapture.exe和 ping.exe。测试结果如表 2所示。

表2 控制台程序兼容性测试结果

从表2可以看出,由于常用的系统提供的控制台程序中没有提供用于对外通信的模块,因此无法与其他程序通信。而NetCapture.exe是第三方的控制台程序,自身带有通信模块,所以能够兼容。基于控制台程序窗口标准输入输出重定向的方式在不修改控制台程序的前提下,无法用于常用的系统控制台程序;基于控制台程序窗口I/O缓冲区读写的方式能够将控制台程序作为单独模块,保证其完整性,因此,可以很好地用于常用的各种控制台程序,保证该模型对控制台程序的兼容性。

5 结束语

由于现有方案中需要对控制台程序的标准输入输出进行重定向,容易与系统软件发生冲突,并导致系统不稳定;同时为了支持远程交互,需要对控制台程序进行修改,添加远程通信模块,因此对控制台程序的兼容性较差。

本文提出了一种基于I/O缓冲区读写的控制台远程交互模型,将控制台程序作为独立模块,并设计了用于扩展其功能的加载器,无需对控制台程序进行修改。该加载器采用模拟键盘输入到控制台窗口输入缓冲区的方式实现控制台程序命令行窗口的输入,从控制台窗口的输出缓冲区中获取回显数据,并通过网络使本地控制台程序与远程主机接入端进行远程数据通信,从而实现非重定向条件下与控制台程序的交互,增强了对不同类型控制台程序的兼容性。

[1]Kara A.Secure Remote Access from Office to Home[J].IEEE Communications Magazine, 2001, 39(10): 68-72.

[2]Richardson T.Virtual Network Computing[J].IEEE Internet Computing, 1998, 2(1): 33-38.

[3]Microsoft White Paper.Remote Desktop Protocol(RDP)Features and Performance[EB/OL].(2007-01-20).http://www.microsoft.com/technet/prodtechnol/Win2KTS/evaluate/featfunc/rdpfperf.mspx.

[4]Stallings W.Network Security Essentials: Applications and Standards[M].[S.l.]: Prentice-Hall, Inc., 2000.

[5]Cai Longzheng, Yu Shengsheng, Zhou Jingli.Research and Implementation of Remote Desktop Protocol Service over SSL VPN[C]//Proc.of IEEE International Conference on Service Computing.[S.l.]: IEEE Computer Society, 2004:502-505.

[6]Kernighan B W.The Unix System and Software Reusability[J]. IEEE Transactions on Software Engineering, 1984, 10(5): 513-518.

[7]Gao Xiaoan, Wang Lina.Networked Control and Monitoring System Based on Industrial Ethernet[C]//Proc.of the 6th IEEE Conference on Industrial Electronics and Applications.[S.l.]: IEEE Press, 2011: 1337-1341.

[8]Bellucci A, Malizia A, Diaz P, et al.Human-display Interaction Technology: Emerging Remote Interfaces for Pervasive Display Environments[J].IEEE Pervasive Computing, 2010, 9(2): 72-76.

[9]Richter J, Nasarre C.Windows via C/C++[M].Redmond,USA: Microsoft Press, 2008.

[10]范文庆, 周彬彬, 安 靖.Windows API 开发详解——函数、接口、编程实例[M].北京: 人民邮电出版社,2011.

猜你喜欢
命令行缓冲区命令
只听主人的命令
一种基于docker集群的自动评价虚拟命令行实验终端构建及其在类Unix系统教学中的应用
Windows 10新版CMD更新
移防命令下达后
基于网络聚类与自适应概率的数据库缓冲区替换*
嫩江重要省界缓冲区水质单因子评价法研究
基于Linux的OnlineJudge在线提交环境的搭建
Linux系统下GRIB2格式GFS资料转为GRIB1格式的方法详解
这是人民的命令
关键链技术缓冲区的确定方法研究