CN111291299A - 一种直接获取本地命令执行结果的方法及本地服务器 - Google Patents
一种直接获取本地命令执行结果的方法及本地服务器 Download PDFInfo
- Publication number
- CN111291299A CN111291299A CN202010075995.3A CN202010075995A CN111291299A CN 111291299 A CN111291299 A CN 111291299A CN 202010075995 A CN202010075995 A CN 202010075995A CN 111291299 A CN111291299 A CN 111291299A
- Authority
- CN
- China
- Prior art keywords
- command
- request
- output information
- line
- command line
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/958—Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/955—Retrieval from the web using information identifiers, e.g. uniform resource locators [URL]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/38—Creation or generation of source code for implementing user interfaces
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Software Systems (AREA)
- Human Computer Interaction (AREA)
- Computer And Data Communications (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种直接获取本地命令执行结果的方法及本地服务器,该方法包括:根据用户代理发送的命令请求进行合法性检查,生成有效命令行;根据有效命令行进行执行,生成命令行输出信息;根据命令行输出信息进行过滤,得到过滤输出信息;根据过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。通过实施本发明,引入新的图式,为HTML网页提供了直接执行本地命令行输出结果的能力,降低了编写前端脚本程序或者后台服务器程序的代码量。同时,由于历史积累,Linux等操作系统中存在大量优秀的命令行工具或者脚本程序,通过引入的图式,可以让Web前端代码方便地利用这些工具或者脚本完成相关工作,从而扩展Web前端技术的应用场景。
Description
技术领域
本发明涉及网页前端技术领域,具体涉及一种直接获取本地命令执行结果的方法及本地服务器。
背景技术
网页前端是运行在PC端、移动端等浏览器上展现给用户浏览的网页。前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括基本的HTML和CSS以及JavaScript/ajax。
当采用现有的网页前端技术访问本地系统数据或功能时,需要通过扩展JavaScript本地绑定对象的方法。例如PhoneGap为移动端的Web App提供了大量的JavaScript本地绑定对象,从而可以让开发者在Web App中使用它提供的接口来操作本地系统对象。又如在桌面操作系统上,当我们利用网页前端技术实现Web App时,为了最大程度上获得对系统中各种资源的访问能力,可通过集成一个运行在本地的HTTP服务器(如Node.js)来实现此类功能。如开源的跨操作系统桌面Web App的支持框架Electron就是一个典型应用。
然而,无论使用JavaScript本地绑定还是使用Electron这种方案,都需要编写额外的脚本程序,加大了开发人员的工作量;同时上述方案中采用的ECMAScript是解释性编程语言,执行效率相对较低,且占用内存大。
发明内容
有鉴于此,本发明实施例提供了一种直接获取本地命令执行结果的方法及本地服务器,以解决现有技术中访问本地系统数据或功能时需要编写额外的脚本程序,且占用内存较大的技术问题。
本发明提出的技术方案如下:
本发明实施例第一方面提供一种直接获取本地命令执行结果的方法,该方法包括如下步骤:根据用户代理发送的命令请求进行合法性检查,生成有效命令行;根据所述有效命令行进行执行,生成命令行输出信息;根据所述命令行输出信息进行过滤,得到过滤输出信息;根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。
可选地,根据用户代理发送的命令请求进行合法性检查之前,包括:根据预设协议获取用户代理发送的命令请求,所述命令请求包括请求行、头部、空行和请求体。
可选地,根据用户代理发送的命令请求进行合法性检查,生成有效命令行,包括:根据用户代理发送的命令请求检查所述命令请求是否超过设定值;当未超过设定值时,将所述请求行和请求体中的请求参数进行分离;根据所述分离的请求参数生成有效命令行。
可选地,所述请求参数包括:可执行程序路径、用户标识符、过滤器和变量化命令行。
可选地,根据所述有效命令行进行执行,生成命令行输出信息,包括:根据所述用户标识符确定用户身份;根据所述用户身份执行可执行程序路径指定的可执行程序,生成命令行输出信息。
可选地,根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果,包括:判断合法性检查、执行及过滤过程是否发生错误;当未发生错误时,根据所述过滤输出信息进行格式化过滤,生成格式化输出信息;根据所述格式化输出信息计算响应体的长度;根据所述格式化输出信息和所述响应体的长度得到命令响应;将所述命令响应写入到套接字,得到命令请求的执行结果。
可选地,该直接获取本地命令执行结果的方法还包括:当发生错误时,根据错误生成响应体值;根据所述响应体值得到命令响应;将所述命令响应写入到套接字,得到命令请求的执行结果。
本发明实施例第二方面提供一种本地服务器,该本地服务器包括:请求合法性检查模块,用于根据用户代理发送的命令请求进行合法性检查,生成有效命令行;命令行执行模块,用于根据所述有效命令行进行执行,生成命令行输出信息;过滤器模块,用于根据所述命令行输出信息进行过滤,得到过滤输出信息;响应输出模块,用于根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。
本发明实施例第三方面提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使所述计算机执行如本发明实施例第一方面及第一方面任一项所述的直接获取本地命令执行结果的方法。
本发明实施例第四方面提供一种直接获取本地命令执行结果的终端,包括:存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行如本发明实施例第一方面及第一方面任一项所述的直接获取本地命令执行结果的方法。
本发明提供的技术方案,具有如下效果:
本发明实施例提供的直接获取本地命令执行结果的方法及本地服务器,通过新引入的lcmd图式,为HTML网页提供了直接执行本地命令行输出结果的能力,降低了编写前端脚本程序或者后台服务器程序的代码量。因此,通过实施本发明,解决了现有技术中访问本地系统数据或功能时需要编写额外的脚本程序,且占用内存较大的技术问题。同时,由于历史积累,Linux等操作系统中存在大量优秀的命令行工具或者脚本程序,通过lcmd图式,可以让Web前端代码方便地利用这些工具或者脚本完成相关工作,从而扩展Web前端技术的应用场景。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例的直接获取本地命令执行结果的方法的流程图;
图2是根据本发明另一实施例的直接获取本地命令执行结果的方法的流程图;
图3是根据本发明另一实施例的直接获取本地命令执行结果的方法的流程图;
图4是根据本发明另一实施例的直接获取本地命令执行结果的方法的流程图;
图5是根据本发明实施例的本地服务器的结构框图;
图6是根据本发明实施例的本地服务器的结构原理图;
图7是根据本发明另一实施例本地服务器的结构原理图;
图8是本发明实施例提供的直接获取本地命令执行结果终端硬件结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种直接获取本地命令执行结果的方法,如图1所示,该方法包括如下步骤:
步骤S101:根据用户代理发送的命令请求进行合法性检查,生成有效命令行。
在一实施例中,在进行合法性检查之前,可以根据预设协议获取用户代理发送的命令请求,该命令请求包括请求行、头部、空行和请求体。其中,预设协议可以是本地服务器和用户代理(浏览器或其他客户端)进程之间的Unix Domain Socket通讯协议,该通讯协议类似HTTP1.1,可以将其称之为LCMD协议,在该实施例中可以将通讯协议的名称定为LCMD/1.0,1.0指版本号。
在一实施例中,根据网页的要求(通过Ajax接口可指定请求同步执行还是异步执行)或者上下文(表单提交请求一般是同步执行的),用户代理(浏览器或其他程序)会发起异步请求或者同步请求。同步请求或者异步请求是相对于网页内容或者脚本的上下文而言的,会在用户代理内部作处理,对请求处理进程而言无须关心。因此,对lcmd图式来讲,在用户代理一侧发起请求的过程和后续处理与HTTP等图式几乎是一模一样的。区别在与:
1.对HTTP等图式,URL请求处理进程连接远程服务器,按照HTTP协议的约定发送请求并等待服务器的返回;对lcmd图式来讲,URL请求处理进程通过套接字连接到提供lcmd服务的本地服务器进程,通过套接字发送请求,并等待服务器返回的内容。
2.对HTTP等图式,URL请求处理进程按照HTTP协议的响应头信息处理本地缓存;对lcmd图式来讲,URL请求处理进程不处理本地缓存,也就是说,对任何由lcmd本地服务器返回的结果都不做本地缓存处理。
例如要执行本地系统中Is命令(路径为)/bin/ls),可通过如下URL运行该程序并获取其输出。
lcmd:///bin/ls?cmdFilter=delimiter('%20')&cmdLine=ls%20--color%3Dnever%20-l%20%2F
在该URL中,lcmd是本发明引入的新的URL图式(schema),用于指定本URL用于执行本地命令,也可以选择其他名称作为新的URL图式;/bin/ls指定了要运行的程序文件之路径;cmdFilter参数指定对命令行输出结果进行JSON化处理时的过滤器名称及参数;本例指定的过滤器为delimiter(”),即列分割符过滤器,所使用的分割符在()中定义,上例中为空格();cmdLine参数指定命令行,经过URI编码(对URL中特殊字符,如空格、逗号、分号等做转义)处理,解码后的内容为:
ls--color=never-l/
该URL也可以理解为其目标资源(可执行程序)为/bin/ls,命令行为ls--color=never-l/,命令输出的结果过滤器为delimiter(”)。
在一实施例中,对于上述LCMD URL,可以采用GET方法传递也可以采用POST的方法进行传递。其中,采用GET方法时,用户代理发送的LCMD请求的内容如下:
GET
/bin/ls?cmdFilter=delimiter('%20')&cmdLine=ls%20--color%3Dnever%20-l%20%2F LCMD/1.0
User-Agent:Mozilla/5.0(Windows;U;Windows NT 5.1;en-US;rv:1.7.6)Gecko/20050225Firefox/1.0.1
User:username
此外,采用POST方法传递命令请求时,其请求内容如下:
POST/bin/ls LCMD/1.0
User-Agent:Mozilla/5.0(Windows;U;Windows NT 5.1;en-US;rv:1.7.6)Gecko/20050225Firefox/1.0.1
User-Id:100
Content-Type:application/x-www-form-urlencoded
Content-Length:67
cmdFilter=delimiter('%20')&cmdLine=ls%20--color%3Dnever%20-l%20%2F
在上述两个命令请求中,其对应的头部信息包括User-Agent(表示用户代理标识字符串)、User-Id(表示执行用户代理的用户标识符,和User-Name二者选其一,在本例中为100。该头部信息将用作合法性检查)、User-Name(表示执行用户代理的用户账号名称,和User-Id二者选其一。该头部信息将用作合法性检查,主要在非Unix类操作系统上使用)、Content-Type(使用POST方法时,该头部信息规定了请求体的内容类型,通常为application/x-www-form-urlencoded)、Content-Length(使用POST方法时,该头部信息规定了请求体的内容长度(字节数),上例中为67)。
步骤S102:根据有效命令行进行执行,生成命令行输出信息;具体地,在执行有效命令行时,可以以userId用户身份执行execPath指定的可执行程序,并将cmdLine作为命令行参数传入其中,得到命令行输出信息。
步骤S103:根据命令行输出信息进行过滤,得到过滤输出信息;具体地,在进行过滤时,主要采用预定义的过滤器中的行分割过滤器、行截取过滤器、列分割过滤器及列截取过滤器。
其中,过滤器过滤的实现方法有以下两种。
第一种是将命令行程序的全部命令行输出信息整个保存在内存中,将行中的每个列组织为列链表结构(初始每行只有一列),然后再将列链表组织为行链表。在形成的行列双链表结构之上,不论作用哪一个行列过滤器,都将保持这一数据结构不变,变化的只是列链表中元素个数、元素内容以及行链表中元素个数、元素内容。因此,可以在该数据结构之上多次重复执行行列过滤器。
第二种是将命令行程序的命令行输出信息当作文本流(text stream)处理,每次处理一行,行之间用\n字符分割,列之间用一个选定的内部分割符分割,初始时,每一行只有一列。在Unix类系统上,可以创建多个过滤器子进程,然后使用管道将这些过滤器子进程连接起来,使命令行子进程的输出以及前一个过滤器的输出作为下一个过滤器的输入。其原理和Bash Shell中使用管道执行多条命令类似,如ls--color=never-l/|grep^d|head-n 3。使用这一方法时,需要利用一个统一的内部列分割符来标识每一行中的列,可以选择ASCII字符集中的0x1F(unit separator,单元分割器)作为内部分割符;每次执行列分割过滤器时,使用这个字符来分割新产生的两个相邻的列。
对于上述两种过滤方法,第一种方法可适用于任何操作系统环境,而第二种方法仅适用于Unix类操作系统。第一种方法需要获得全部输出后才能处理,而第二种方法在输出过程中即可进行处理。在输出内容较多时,第一种方法消耗的内存偏大,而第二种方法若不考虑创建子进程的内存消耗,则每次消耗的内存只是最长的行那么大。因此,在Unix类操作系统中可以采用第二种方法,在其他操作系统中,可以选择第一种方法。
由于一个过滤器通常有一个名称以及一项参数或多项参数,比如delimiter('\t'),表示过滤器名称为delimiter,分割符为制表符(\t)或空格()。在lcmd URL中,还可以指定多个过滤器依次对命令行输出进行处理,多个过滤器之间用分号(;)分割。
例如对上述LCMD URL命令行输出,使用delimiter(”)过滤器并指定分割符为空格时,JSON化的处理结果为:
如果对上述命令行输出,先使用某个行截取过滤器,然后使用列分割过滤器,再使用某个列截取过滤器,最后使用字典格式化过滤器,如ingore(0,1);delimiter(”);ctail(8,1);keys('name'),则结果为:
若使用array()格式化过滤器,则结果为:
步骤S104:根据过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。具体地,生成命令响应输出时,可以首先构建一个JSON对象代表响应体,然后按照LCMD响应的格式要求写入套接字,最终得到命令响应输出。
本发明实施例提供的直接获取本地命令执行结果的方法,通过新引入的lcmd图式,为HTML网页提供了直接执行本地命令行输出结果的能力,降低了编写前端脚本程序或者后台服务器程序的代码量。因此,通过实施本发明,解决了现有技术中访问本地系统数据或功能时需要编写额外的脚本程序,且占用内存较大的技术问题。同时,由于历史积累,Linux等操作系统中存在大量优秀的命令行工具或者脚本程序,通过lcmd图式,可以让Web前端代码方便地利用这些工具或者脚本完成相关工作,从而扩展Web前端技术的应用场景。
作为本发明实施例的一种可选的实施方式,当使用lcmd图式的URL作为表单提交的action属性时,由于lcmd图式返回的内容是JSON格式,并不能直接提供给用户代理展示。因此,需要同时定义一个正常的结果页URL。
如下所示:
由于在上面的form元素中使用destination属性定义了目标URL。当表单提交成功(即
lcmd:///bin/rm?cmdFilter=head(0)&cmdLine=rm%20%24FILE&FILE=test.txt的状态码为2xx时),用户代理应该导航到destination属性定义的目标URL(/files.html)上。
作为本发明实施例的一种可选的实施方式,如图2所示,步骤S101根据用户代理发送的命令请求进行合法性检查,生成有效命令行,包括如下步骤:
步骤S201:根据用户代理发送的命令请求检查命令请求是否超过设定值;具体地,需要检查正在处理未返回的LCMD请求是否超过设定值,包括来自单个用户代理运行实例(进程)的所有正在处理的请求个数以及全部正在处理的LCMD请求个数。
步骤S202:当未超过设定值时,将请求行和请求体中的请求参数进行分离。
在一实施例中,可以将请求行和请求体中的可执行程序路径(exePath,如/bin/ls)、用户标识符(userId,用于执行命令行)、过滤器(cmdFilter)和变量化命令行(cmdLine)分离出来,并将其组织为字典数据结果。此外,也还可以将请求行和请求体中的其他请求参数进行分离。
其中,userId是执行命令行的用户标识符,通常就是执行用户代理进程的用户标识符。尽管LCMD的请求头部中包含有User-Id信息,但不能依赖该头部信息来确定用户代理进程的用户标识符,而应该通过系统调用获得Unix套接字另一端的进程以及用户标识符信息。在Unix类系统上,通过调用getsockopt函数获得SO_PEERCRED选项的值来获得此信息。如果通过系统调用获得的用户标识符和通过LCMD请求头部中的用户标识符不符,则应当作非法请求处理。
为了通过表单元素的名称和值构成不同的命令行,可以对发送的命令请求作变量化处理。具体可以使用$作为前缀定义命令行中的变量,也可以使用不同于$字符的变量名称定义规则,比如%、^等。可以采用$Id,表示在生成最终的命令行时,该变量要使用同时传递的同名URL参数替代。也可以使用其他URL参数定义该变量的值。因此,对于上述LCMDURL,可以作变量化处理得到:
lcmd:///bin/cat?cmdFilter=delimiter('%3A')&cmdLine=cat%20%24FILE&FILE=%2Fetc%2Fpasswd
该URL包含三个参数:cmdFilter(定义过滤器,这里为delimiter(':'));cmdLine对应的值是一个变量化的命令行,解码后为:cat$FILE;FILE对应的值是/etc/passwd。该参数将用来替代上面变量化命令行字符串中的$FILE。因此,该URL最终执行的命令行为:
cat/etc/passwd
通过变量化命令行,有利于通过表单中的输入项来设定命令后中的不同值,而变量化的命令行可以保持不变,从而降低编码量。而如果不使用变量化的命令行,将需要额外的脚本代码来生成最终的命令行。
变量化命令行中的变量名称需满足如下规范:以$字符开头,紧随其后的字符必须为字母;其后只包含数字、字母和下划线;任何非数字、字母和下划线字符表示变量名称的终结;保留$字符后为数字的情形,可用作以顺序指代参数;变量名称是大小写敏感的;也就是说$abc和$Abc表示不同的变量。为了正确处理命令行中原本含有$字符的情形,需要对$字符作转义处理:对原命令行中按以上规则会被处理为变量名称的,使用$$做转义处理。若按以上规则不会处理为变量名称的,无须做转义处理。
如下面的原始命令行:
cat/$path/$
需要做如下转义处理:
cat/$$path/$
原始命令行语句中的最后一个$字符,由于不构成变量化命令行的变量名称,故而无须转义。此外,对于变量化命令行,也可以采用不同于$字符的变量名称定义规则,比如%、^等。
由于用户代理在生成命令行时进行了变量化处理,因此在将请求行和请求体中的请求参数进行分离时,可以将变量化命令行(cmdLine)参数进行分离。
在一实施例中,进行合法性检查时,还可以检查请求头部中定义的用户标识符userId是否和套接字返回的选项值匹配;检查exePath指定的可执行程序路径是否存在以及指定的可执行程序是否具有可执行权限;检查cmdFilter过滤器语法是否正确,并构成有效过滤器取代cmdFilter的值。其中,检查过滤器时,除了检查过滤器语法是否正确外,还可以检查格式化过滤器是否只有一处且位于最后,如果没有指定格式化过滤器,要在最后追加默认的字典格式化过滤器。
在一实施例中,对于命令请求中的过滤器,可以采用预定义的过滤器,如行分割过滤器、行截取过滤器、列分割过滤器、列截取过滤器及格式化过滤器等。
其中,行分割过滤器可以包括:
split(D),使用D中任意一个字符作为分割符分割行,该过滤器用于将单个行分割成多个行。split('\t.')表示在行中遇到制表符(\t)或者句点(.)时会将当前行分割为两行。比如对"Hello,world!"执行split(”),会将这行分割为"Hello,"和"world!"两行。
chars(),将每个字符当作一行进行分割。
letters(),将每个字母当作一行进行分割,且忽略标点符号等特殊字符。如"hello(你好!)"会被分割为"h"、"e"、"l"、"l"、"o"、"你"、"好"等7行。该分割符基于语义,所以需要通过LANGUAGE参数传递语言编码,该编码使用ISO 639-2语言编码,如en,zh等,默认为en。
words(LANGUAGE),将每个单词当作一行进行分割,且忽略标点符号等特殊字符。如"hello,world!"会被分割为"hello"、"world"两行。LANGUAGE是用来表示语言的字符串,使用ISO 639-2语言编码,如en,zh等,默认为en。
sentences(LANGUAGE),将每个句子当作一行进行分割,且忽略作为句子间的特殊字符(如空格),但保留标点符号。如"hello,world!I love world!"会被分割为"hello,world!"和"I love world!"两行。LANGUAGE是用来表示语言的字符串,使用ISO 639-2语言编码,如en,zh等,默认为en。
行截取过滤器可以包括:
head(N):截取输出的前面N行。head(0)等同于废弃所有行。
tail(N):截取输出的后面N行。tail(0)等同于废弃所有行。
ignore(I,N):忽略从I开始的N行。I表示行索引值,第一行的索引值为0,最后一行用$表示;N表示要忽略的行数,正值表示从I向后计算,负值表示从I向前计算。如ignore($,-10)表示忽略最后10行输出。N为0将废弃所有行。
pick(A,B):选择索引值匹配An+B公式的行,其中n是零或自然数。比如pick(2,0)将选择第0、2、4等行;pick(3,-1)将选择第2、5、8等行。
cut(A,B):选择索引值不匹配An+B公式的行,其中n是零或自然数。比如cut(2,0)将选择第1、3、5等行;cut(3,-1)将选择第0、1、3、4、6、7等行。
列分割过滤器可以包括:
delimiter(D):使用D中任意一个字符作为分割符分割每一行输出,该过滤器用于将单个列分割成多个列。若未定义参数D,则使用空格为默认分割符。
cchars():将每个字符当作一列进行分割。
cletters():将每个字母当作一列进行分割,且忽略标点符号等特殊字符。如"hello(你好!)"会被分割为"h"、"e"、"l"、"l"、"o"、"你"、"好"等7列。该分割符基于语义,所以需要通过LANGUAGE参数传递语言编码,该编码使用ISO 639-2语言编码,如en,zh等,默认为en。
cwords(LANGUAGE):将每个单词当作一列进行分割,且忽略标点符号等特殊字符。如"hello,world!"会被分割为"hello"、"world"两列。LANGUAGE是用来表示语言的字符串,使用ISO 639-2语言编码,如en,zh等,默认为en。
csentences(LANGUAGE):将每个句子当作一列进行分割,且忽略作为句子间的特殊字符(如空格),但保留标点符号。如"hello,world!I love world!"会被分割为"hello,world!"和"I love world!"两列。LANGUAGE是用来表示语言的字符串,使用ISO 639-2语言编码,如en,zh等,默认为en。
列截取过滤器可以包括:
chead(N):截取输出的前面N列。
ctail(N):截取输出的后面N列。
cignore(I,N):忽略从I开始的N列。I表示列索引值,第一列的索引值为0,最后一列用$表示;N表示要忽略的列数,正值表示从I向后计算,负值表示从I向前计算。如cignore($,-10)表示忽略最后10列输出。
cpick(A,B):选择索引值匹配An+B公式的列,其中n是零或自然数。比如cpick(2,0)将选择第0、2、4等列;cpick(3,-1)将选择第2、5、8等列。
ccut(A,B):选择索引值不匹配An+B公式的列,其中n是零或自然数。比如ccut(2,0)将选择第1、3、5等列;ccut(3,-1)将选择第0、1、3、4、6、7等列。
格式化过滤器可以包括:
keys(KEY1,KEY2,...):为已分割的列赋予键名,KEY1、KEY2等表示各列的键名,若未定义,则使用c0、c1等。该格式化过滤器可被称为“字典过滤器”。
array(N,C):将各列作为字符串形成数组进行格式化,N表示最大的数组元素个数,超过N的其它列,将被合并到最后一个元素并使用C作为连接字符(默认为空格)。比如有如下三列file0、file1、file2,执行array(3,”)后将被格式化为数组["file0","file1","file2"];执行array(2,':')后将被格式化为数组["file0","file1:file2"]。若N未定义,则按照将每个列处理为一个数组元素。该格式化过滤器可被称为“数组过滤器”。
若不指定格式化过滤器,则默认使用keys()字典过滤器。
具体地,在命令请求中使用过滤器时应该符合如下规则:始终在最后使用格式化过滤器;如果未指定格式化过滤器,则默认使用keys('c0','c1',...)字典过滤器。可以多次应用行、列分割过滤器以及截取过滤器。因此,在对命令请求中的过滤器的使用进行合法性检查时,可以按照预定义的过滤器和上述规则进行检查。
需要说明的是,关于上述预定义的行分割过滤器、行截取过滤器、列分割过滤器、列截取过滤器也可以采用已有的文本处理工具,利用管道连接这些命令执行过滤器的功能,这些已有的工具包括:head:截取前N行;tail:截取后N行;cut:按列处理每一行。也可以使用更复杂的文本处理方法,如sed:流编辑工具、grep:模式匹配工具等。
步骤S203:根据分离的请求参数生成有效命令行。具体地,在生成最终的有效命令行时,需要确定所有符合约定的命令行变量是否均包含有对应的参数,如有,则用该参数的值替代该变量,即要用实际值替换这些变量从而生成要执行的命令行。
需要说明的是,检查请求合法性时,在出现非法请求情况下,可能提前返回错误状态。其中,错误状态可以用400Bad Request(错误请求)、403Forbidden(禁止)或404NotFound(找不到)等状态码表示。此外,还可以包括其他的状态码,这些状态码可以是HTTP状态码的子集。具体可以包括消息状态码(对应的HTTP状态码范围为100~199)以及重定向状态码(对应的HTTP状态码范围为300~399)。
作为本发明实施例的一种可选的实施方式,如图3所示,步骤S103根据有效命令行进行执行,生成命令行输出信息,包括如下步骤:
步骤S301:根据用户标识符确定用户身份。
步骤S302:根据用户身份执行可执行程序路径指定的可执行程序,生成命令行输出信息。
具体地,在Unix类操作系统上,根据有效命令行进行执行,生成命令行输出信息时,可以创建管道,执行fork系统调用创建子进程;在子进程中调用setuid设置有效用户标识符,同时将父进程创建的管道一头设置为命令行输出(文件描述符为1)。至此,子进程将以userId指定的用户身份运行。由于通常情况下本地服务器是以root用户身份执行的,如果不调用setuid系统,将会创建一个巨大的安全性漏洞,使得一般的用户代理可以利用LCMD请求执行高风险的系统命令。之后在子进程中调用execl或execv等系统调用执行execPath指定的可执行程序,并传入cmdLine作为命令行参数。在父进程中,读取管道另一端,即可获取子进程,也就是命令行输出信息。
在Unix类系统上,父进程可调用如下函数完成以上功能并返回读取命令行输出的管道文件描述符:
需要说明的是,在上述代码中,需要事先将cmdLine字符串用空格作为分割符将其转换成了参数列表以调用execv函数。同时父进程应该调用waitpid系统调用监视子进程的退出状态,以便设置LCMD响应中的状态码以及退出码。
作为本发明实施例的一种可选的实施方式,如图4所示,步骤S104根据过滤输出信息计算生成命令响应输出,得到命令请求的执行结果,包括如下步骤:
步骤S401:判断合法性检查、执行及过滤过程是否发生错误;在生成命令响应输出时,可以首先判断合法性检查、执行及过滤过程是否发生错误,即判断上述步骤S101、步骤S102及步骤S103在运行过程中是否发生错误。
步骤S402:当未发生错误时,根据过滤输出信息进行格式化过滤,生成格式化输出信息;具体地,当未发生错误时,可以对过滤输出信息的每一行应用格式化过滤器,生成字符串数组(格式化过滤器为array时)或者字典(格式化过滤器为keys时),之后将格式化过滤器的输出作为响应体JSON对象的lines键值,并相应设置statusCode、errorMsg、exitCode等键值,即得到格式化输出信息。
在一实施例中,当发生错误时,根据错误生成响应体值,即将响应体中的lines设置为NULL,并相应设置statusCode、errorMsg、exitCode等键值,得到命令响应;之后输出响应内容到套接字,得到命令请求的执行结果。
步骤S403:根据格式化输出信息计算响应体的长度。
步骤S404:根据格式化输出信息和响应体的长度得到命令响应。
步骤S405:将命令响应写入到套接字,得到命令请求的执行结果。其中将响应内容写入到套接字即得到LCMD响应,LCMD响应的格式和LCMD请求类似,包括如下部分:状态行(status-line)、头部(headers)、空行(blank line)、响应体(response-body)。
比如对上述LCMD请求,对应的响应内容为:
其中的头部信息包括:Date:响应发送的时间;Content-Type:该头部信息规定了响应体的内容类型及字符集,内容类型(MIME)固定为application/json,而字符集一般为UTF-8;Content-Length:该头部信息规定了响应体的内容长度(字节数),上例中为408。
需要说明的是,LCMD响应体的字符集编码,考虑到过滤器的工作机制建立在ASCII控制字符之上,因此,响应体的字符集及编码必须是ASCII兼容字符集或编码,如ISO8859-1、UTF-8等。
在一实施例中,由于lcmd图式所获取的资源始终表达为JSON格式,因此其结果可直接被JavaScript脚本程序使用以实现特定的功能,比如用来动态生成DOM结点。具体地,本发明实施例给出了不使用JavaScript脚本的情况下,如何使用lcmd图式。
比如,如下HTML页面片段定义了一个表格,其中列出了某个目录中的文件,访问该页面的用户,可以点击每行末尾的“Delete”按钮来直接调用本地系统命令而删除对应的文件:
本发明实施例还提供一种本地服务器,如图5所示,该本地服务器包括:
请求合法性检查模块1,用于根据用户代理发送的命令请求进行合法性检查,生成有效命令行;详细内容参见上述方法实施例中步骤S101的相关描述。
命令行执行模块2,用于根据所述有效命令行进行执行,生成命令行输出信息;详细内容参见上述方法实施例中步骤S102的相关描述。
过滤器模块3,用于根据所述命令行输出进行过滤,得到过滤输出信息;详细内容参见上述方法实施例中步骤S103的相关描述。
响应输出模块4,用于根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。详细内容参见上述方法实施例中步骤S104的相关描述。
在WebKit等开源的Web引擎中,包括HTTP、HTTPS等URL的请求均由独立运行的子进程(称为“URL请求处理进程”)负责处理,因此,本发明实施例提供的本地服务器的实现方式也可以按照该架构实现。
在一实施例中,如图6所示,可以将lcmd URL的请求即本地服务器直接集成到用户代理的URL请求处理进程中,对每个lcmd请求启动一个新的子进程,在子进程中执行相应的命令行,并通过管道对命令行输出作进一步处理(如执行过滤器),最后获得执行结果后返回。
在一实施例中,如图7所示,可以将lcmd URL的处理在本地运行的服务器进程中实现,用户代理的URL请求处理进程通过套接字连接到该服务器进程,通过套接字提交请求参数,然后等待服务器返回对应的处理结果。这一方法还可以为除了用户代理之外的其他程序提供lcmd的实现,就如同可以在一般性的C/C++程序甚至Python脚本程序中发起HTTP请求一样。
本发明实施例提供的本地服务器的功能描述详细参见上述实施例中直接获取本地领命执行结果的方法描述。
本发明实施例还提供了一种中直接获取本地领命执行结果终端,如图8所示,该中直接获取本地领命执行结果终端可以包括处理器51和存储器52,其中处理器51和存储器52可以通过总线或者其他方式连接,图8中以通过总线连接为例。
处理器51可以为中央处理器(Central Processing Unit,CPU)。处理器51还可以为其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。
存储器52作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明实施例中的对应的程序指令/模块。处理器51通过运行存储在存储器52中的非暂态软件程序、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施例中的中直接获取本地领命执行结果的方法。
存储器52可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储处理器51所创建的数据等。此外,存储器52可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器52可选包括相对于处理器51远程设置的存储器,这些远程存储器可以通过网络连接至处理器51。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述一个或者多个模块存储在所述存储器52中,当被所述处理器51执行时,执行如图1-4所示实施例中的中直接获取本地领命执行结果的方法。
上述中直接获取本地领命执行结果终端具体细节可以对应参阅图1至图4所示的实施例中对应的相关描述和效果进行理解,此处不再赘述。
本领域技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)、随机存储记忆体(Random AccessMemory,RAM)、快闪存储器(Flash Memory)、硬盘(Hard Disk Drive,缩写:HDD)或固态硬盘(Solid-State Drive,SSD)等;所述存储介质还可以包括上述种类的存储器的组合。
虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下做出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。
Claims (10)
1.一种直接获取本地命令执行结果的方法,其特征在于,包括如下步骤:
根据用户代理发送的命令请求进行合法性检查,生成有效命令行;
根据所述有效命令行进行执行,生成命令行输出信息;
根据所述命令行输出信息进行过滤,得到过滤输出信息;
根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。
2.根据权利要求1所述的直接获取本地命令执行结果的方法,其特征在于,根据用户代理发送的命令请求进行合法性检查之前,包括:
根据预设协议获取用户代理发送的命令请求,所述命令请求包括请求行、头部、空行和请求体。
3.根据权利要求2所述的直接获取本地命令执行结果的方法,其特征在于,根据用户代理发送的命令请求进行合法性检查,生成有效命令行,包括:
根据用户代理发送的命令请求检查所述命令请求是否超过设定值;
当未超过设定值时,将所述请求行和请求体中的请求参数进行分离;
根据所述分离的请求参数生成有效命令行。
4.根据权利要求3所述的直接获取本地命令执行结果的方法,其特征在于,所述请求参数包括:可执行程序路径、用户标识符、过滤器和变量化命令行。
5.根据权利要求4所述的直接获取本地命令执行结果的方法,其特征在于,根据所述有效命令行进行执行,生成命令行输出信息,包括:
根据所述用户标识符确定用户身份;
根据所述用户身份执行可执行程序路径指定的可执行程序,生成命令行输出信息。
6.根据权利要求1所述的直接获取本地命令执行结果的方法,其特征在于,根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果,包括:
判断合法性检查、执行及过滤过程是否发生错误;
当未发生错误时,根据所述过滤输出信息进行格式化过滤,生成格式化输出信息;
根据所述格式化输出信息计算响应体的长度;
根据所述格式化输出信息和所述响应体的长度得到命令响应;
将所述命令响应写入到套接字,得到命令请求的执行结果。
7.根据权利要求6所述的直接获取本地命令执行结果的方法,其特征在于,还包括:
当发生错误时,根据错误生成响应体值;
根据所述响应体值得到命令响应;
将所述命令响应写入到套接字,得到命令请求的执行结果。
8.一种本地服务器,其特征在于,包括:
请求合法性检查模块,用于根据用户代理发送的命令请求进行合法性检查,生成有效命令行;
命令行执行模块,用于根据所述有效命令行进行执行,生成命令行输出信息;
过滤器模块,用于根据所述命令行输出信息进行过滤,得到过滤输出信息;
响应输出模块,用于根据所述过滤输出信息计算生成命令响应输出,得到命令请求的执行结果。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使所述计算机执行如权利要求1-7任一项所述的直接获取本地命令执行结果的方法。
10.一种直接获取本地命令执行结果的终端,其特征在于,包括:存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行如权利要求1-7任一项所述的直接获取本地命令执行结果的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010075995.3A CN111291299B (zh) | 2020-01-22 | 2020-01-22 | 一种直接获取本地命令执行结果的方法及本地服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010075995.3A CN111291299B (zh) | 2020-01-22 | 2020-01-22 | 一种直接获取本地命令执行结果的方法及本地服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111291299A true CN111291299A (zh) | 2020-06-16 |
CN111291299B CN111291299B (zh) | 2023-08-15 |
Family
ID=71027540
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010075995.3A Active CN111291299B (zh) | 2020-01-22 | 2020-01-22 | 一种直接获取本地命令执行结果的方法及本地服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111291299B (zh) |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2501655A1 (en) * | 2003-10-24 | 2005-04-24 | Microsoft Corporation | Mechanism for providing data driven command line output |
US6912539B1 (en) * | 2002-03-29 | 2005-06-28 | Serena Software, Inc. | Method and apparatus for verifying converted database commands |
CN101073057A (zh) * | 2003-10-24 | 2007-11-14 | 微软公司 | 向命令行指令提供扩展功能的机制 |
CN101091160A (zh) * | 2003-10-24 | 2007-12-19 | 微软公司 | 管理工具环境 |
CN101102322A (zh) * | 2007-08-24 | 2008-01-09 | 华为技术有限公司 | 一种通过图形化界面实现远程控制的方法、系统及客户端 |
CN108446313A (zh) * | 2018-02-06 | 2018-08-24 | 北京极智感科技有限公司 | 一种数据格式转换方法和装置 |
CN110147439A (zh) * | 2018-07-18 | 2019-08-20 | 中山大学 | 一种基于大数据处理技术的新闻事件检测方法及系统 |
CN110222071A (zh) * | 2019-06-06 | 2019-09-10 | 上海达梦数据库有限公司 | 一种数据查询方法、装置、服务器及存储介质 |
CN110493030A (zh) * | 2019-07-05 | 2019-11-22 | 中国平安财产保险股份有限公司 | 网络优化方法、装置、计算机设备及存储介质 |
US20200021608A1 (en) * | 2018-07-13 | 2020-01-16 | Pfu Limited | Information processing apparatus, communication inspecting method and medium |
-
2020
- 2020-01-22 CN CN202010075995.3A patent/CN111291299B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6912539B1 (en) * | 2002-03-29 | 2005-06-28 | Serena Software, Inc. | Method and apparatus for verifying converted database commands |
CA2501655A1 (en) * | 2003-10-24 | 2005-04-24 | Microsoft Corporation | Mechanism for providing data driven command line output |
CN1846204A (zh) * | 2003-10-24 | 2006-10-11 | 微软公司 | 用于提供数据驱动命令行输出的机制 |
CN101073057A (zh) * | 2003-10-24 | 2007-11-14 | 微软公司 | 向命令行指令提供扩展功能的机制 |
CN101091160A (zh) * | 2003-10-24 | 2007-12-19 | 微软公司 | 管理工具环境 |
CN101102322A (zh) * | 2007-08-24 | 2008-01-09 | 华为技术有限公司 | 一种通过图形化界面实现远程控制的方法、系统及客户端 |
CN108446313A (zh) * | 2018-02-06 | 2018-08-24 | 北京极智感科技有限公司 | 一种数据格式转换方法和装置 |
US20200021608A1 (en) * | 2018-07-13 | 2020-01-16 | Pfu Limited | Information processing apparatus, communication inspecting method and medium |
CN110147439A (zh) * | 2018-07-18 | 2019-08-20 | 中山大学 | 一种基于大数据处理技术的新闻事件检测方法及系统 |
CN110222071A (zh) * | 2019-06-06 | 2019-09-10 | 上海达梦数据库有限公司 | 一种数据查询方法、装置、服务器及存储介质 |
CN110493030A (zh) * | 2019-07-05 | 2019-11-22 | 中国平安财产保险股份有限公司 | 网络优化方法、装置、计算机设备及存储介质 |
Non-Patent Citations (2)
Title |
---|
O. KAINZ等: "Proposal of human body description format XML schema and validation of anthropometric parameters", 《2017 IEEE 14TH INTERNATIONAL SCIENTIFIC CONFERENCE ON INFORMATICS》 * |
曾安军: "基于Node.js和REST风格的移动端页面可视化构建平台", 《中国优秀硕士学位论文全文数据库》 * |
Also Published As
Publication number | Publication date |
---|---|
CN111291299B (zh) | 2023-08-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109614569B (zh) | 页面渲染方法、装置及智能终端 | |
US8452925B2 (en) | System, method and computer program product for automatically updating content in a cache | |
US8660976B2 (en) | Web content rewriting, including responses | |
US8145726B1 (en) | Method and apparatus for web resource validation | |
US20030140045A1 (en) | Providing a server-side scripting language and programming tool | |
US20120084346A1 (en) | Page Loading Optimization Using Page-Maintained Cache | |
CN111046311A (zh) | 实现pc端无痕迭代版本的方法、装置、计算机设备及存储介质 | |
CN108536489B (zh) | 匹配资源环境的方法、装置和计算机可读存储介质 | |
CN112154420A (zh) | 自动智能云服务测试工具 | |
CN114760369A (zh) | 一种协议元数据提取方法、装置、设备及存储介质 | |
WO2023109074A1 (zh) | 一种实现联动功能的方法、装置、设备、存储介质和程序 | |
CN115329170A (zh) | 网页抓取方法、装置、设备以及存储介质 | |
CN114489594A (zh) | 一种命令解析器的构建方法、命令解析处理方法及装置 | |
CN112069305B (zh) | 数据筛选方法、装置及电子设备 | |
CN111723314A (zh) | 网页展示方法、装置、电子设备及计算机可读存储介质 | |
CN112883088B (zh) | 一种数据处理方法、装置、设备及存储介质 | |
WO2015183235A1 (en) | Response based on browser engine | |
CN111309765B (zh) | 一种直接查询结构化数据的方法及装置 | |
CN111291299A (zh) | 一种直接获取本地命令执行结果的方法及本地服务器 | |
US7032167B1 (en) | Method and apparatus for a document parser specification | |
US8977718B2 (en) | Website redevelopment wrapper | |
CN111090426A (zh) | 一种http请求处理的方法、系统及设备 | |
CN116303322B (zh) | 一种声明式日志泛化方法及装置 | |
CN117171800B (zh) | 一种基于零信任防护体系的敏感数据识别方法及装置 | |
CN113961850B (zh) | 网页的特定内容提取方法、装置、设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |