基于Paramiko的交互式命令执行方法及装置与流程

文档序号:26101663发布日期:2021-07-30 18:12阅读:405来源:国知局
基于Paramiko的交互式命令执行方法及装置与流程

本发明涉及通信技术领域,尤其涉及一种基于paramiko的交互式命令执行方法及装置。



背景技术:

paramiko是对ssh(secureshell安全外壳协议)协议的一种python语言实现,可使用其作为ssh客户端去连接ssh服务端,然后执行命令。

交互式命令即一条命令在执行过程中还需用户根据提示输入必要的信息后方可继续,如一条删除文件的命令在执行过程中会提示用户是否确认删除,当用户输入yes确认后方才执行删除操作。然而,paramiko的执行命令的方法无法执行交互式命令。



技术实现要素:

本发明要解决的技术问题是如何基于paramiko执行交互式命令,本发明提出一种基于paramiko的交互式命令执行方法及装置。

根据本发明实施例的基于paramiko的交互式命令执行方法,包括:

基于shell类,定义execute函数,包括:第一execute函数和第二execute函数;

执行所述第一execute函数,并基于所述第一execute函数中的第一expect判断所执行的命令是非交互式命令还是交互式命令;

当判定所执行的命令为交互式命令时,调用所述shell类中的_recv_until函数,当所述_recv_until函数的指定状态为第一expect预设内容时,返回回显字符串;

执行所述第二execute函数,当所述第二execute函数中的第二expect为’0’时,完成交互命令的执行。

根据本发明的一些实施例,在执行所述第一execute时,当所述第一expect为’0’或”时,

调用所述shell类中的_recv_until函数,当所述_recv_until函数的指定状态为命令执行已结束时,返回回显字符串。

在本发明的一些实施例中,采用_is_cmd_done函数判断命令是否执行结束。

根据本发明的一些实施例,当所述第二expect为’0’时,所述方法还包括:

调用_get_rc获取返回码,并检查所述返回码是否为noeer_rc,若否,则进行报错;

调用_wash_rs清洗回显字符串,将清洗后的字符串作为返回值返回。

在本发明的一些实施例中,所述execute函数的参数包括:

self,用于标识类实例本身;

command,用于输入待执行的命令字符串;

expect,为期望字符串,当expect为’0’时,表示期望无错误;当expect为”时,表示期望命令执行完成且不检查是否有错;当expect为除’0’和”外的内容时,表示期望显示中出现指定的内容;

timeout,用于限定命令超时时间;

chan,用于指定channel。

根据本发明实施例的基于paramiko的交互式命令执行装置,包括:

定义模块,用于基于shell类,定义execute函数,包括:第一execute函数和第二execute函数;

交互命令判断模块,用于执行所述第一execute函数,并基于所述第一execute函数中的第一expect判断所执行的命令是非交互式命令还是交互式命令;

第一执行模块,用于当判定所执行的命令为交互式命令时,调用所述shell类中的_recv_until函数,当所述_recv_until函数的指定状态为第一expect预设内容时,返回回显字符串;

第二执行模块,用于执行所述第二execute函数,当所述第二execute函数中的第二expect为’0’时,完成交互命令的执行。

根据本发明的一些实施例,所述装置还包括:

报错模块,用于调用_get_rc获取返回码,并检查所述返回码是否为noeer-_rc,若否,则进行报错;

清洗模块,用于调用_wash_rs清洗回显字符串,将清洗后的字符串作为返回值返回。

在本发明的一些实施例中,所述execute函数的参数包括:

self,用于标识类实例本身;

command,用于输入待执行的命令字符串;

expect,为期望字符串,当expect为’0’时,表示期望无错误;当expect为”时,表示期望命令执行完成且不检查是否有错;当expect为除’0’和”外的内容时,表示期望显示中出现指定的内容;

timeout,用于限定命令超时时间;

chan,用于指定channel。

根据本发明实施例的电子设备,至少包括存储器、处理器,所述存储器上存储有计算机程序,其特征在于,所述处理器在执行所述存储器上的计算机程序时实现上述所述的基于paramiko的交互式命令执行方法的步骤。

根据本发明实施例的计算机存储介质,所述计算机存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述所述的基于paramiko的交互式命令执行方法的步骤。

根据本发明实施例的基于paramiko的交互式命令执行方法、装置、电子设备及计算机存储介质具有如下有益效果:

在任何一种命令行中,交互式命令的使用都是不可完全避免的,如果无法通过程序执行交互式命令,则导致很多操作无法通过程序实现,带来了很大的不便性,由于本发明能够同时执行用于执行交互式和非交互式的命令,避免了paramiko不能执行交互式命令所带来的不便性,使用其可以大大提高通过程序实现对远程服务器的自动化控制程度。

附图说明

图1为根据本发明实施例的基于paramiko的交互式命令执行方法流程图;

图2为根据本发明实施例的shell类的属性和方法示意图;

图3为根据本发明实施例execute方法流程图。

具体实施方式

为更进一步阐述本发明为达成预定目的所采取的技术手段及功效,以下结合附图及较佳实施例,对本发明进行详细说明如后。

本发明中说明书中对方法流程的描述及本发明说明书附图中流程图的步骤并非必须按步骤标号严格执行,方法步骤是可以改变执行顺序的。而且,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。

如图1所示,根据本发明实施例的基于paramiko的交互式命令执行方法,包括:

s110,基于shell类,定义execute函数,包括:第一execute函数和第二execute函数;

s120,执行第一execute函数,并基于第一execute函数中的第一expect判断所执行的命令是非交互式命令还是交互式命令;

s130,当判定所执行的命令为交互式命令时,调用shell类中的_recv_until函数,当_recv_until函数的指定状态为第一expect预设内容时,返回回显字符串;

s140,执行第二execute函数,当第二execute函数中的第二expect为’0’时,完成交互命令的执行。

结合图2所示,根据本发明的一些实施例,在执行第一execute时,当第一expect为’0’或”时,

调用shell类中的_recv_until函数,当_recv_until函数的指定状态为命令执行已结束时,返回回显字符串。例如,可以采用_is_cmd_done函数判断命令是否执行结束。

根据本发明的一些实施例,如图2所示,当第二expect为’0’时,方法还包括:

调用_get_rc获取返回码,并检查返回码是否为noeer_rc,若否,则进行报错;

调用_wash_rs清洗回显字符串,将清洗后的字符串作为返回值返回。

在本发明的一些实施例中,如图3所示,execute函数的参数包括:

self,用于标识类实例本身;

command,用于输入待执行的命令字符串;

expect,为期望字符串,当expect为’0’时,表示期望无错误;当expect为”时,表示期望命令执行完成且不检查是否有错;当expect为除’0’和”外的内容时,表示期望显示中出现指定的内容;

timeout,用于限定命令超时时间;

chan,用于指定channel。

根据本发明实施例的基于paramiko的交互式命令执行装置,包括:定义模块、交互命令判断模块、第一执行模块和第二执行模块。

其中,定义模块用于基于shell类,定义execute函数,包括:第一execute函数和第二execute函数;

交互命令判断模块用于执行第一execute函数,并基于第一execute函数中的第一expect判断所执行的命令是非交互式命令还是交互式命令;

第一执行模块用于当判定所执行的命令为交互式命令时,调用shell类中的_recv_until函数,当_recv_until函数的指定状态为第一expect预设内容时,返回回显字符串;

第二执行模块用于执行第二execute函数,当第二execute函数中的第二expect为’0’时,完成交互命令的执行。

根据本发明的一些实施例,装置还包括:报错模块和清洗模块。

其中,报错模块用于调用_get_rc获取返回码,并检查返回码是否为noeer-_rc,若否,则进行报错;

清洗模块用于调用_wash_rs清洗回显字符串,将清洗后的字符串作为返回值返回。

根据本发明实施例的电子设备,至少包括存储器、处理器,存储器上存储有计算机程序,其特征在于,处理器在执行存储器上的计算机程序时实现上述所述的基于paramiko的交互式命令执行方法的步骤,具体包括:

a10,基于shell类,定义execute函数,包括:第一execute函数和第二execute函数;

a20,执行第一execute函数,并基于第一execute函数中的第一expect判断所执行的命令是非交互式命令还是交互式命令;

其中,当第一expect为’0’或”时,则判定所执行的命令为非交互式命令,当第一expect为’0’和”外的其他内容时,则判定所执行的命令为交互式命令;

a30,当判定所执行的命令为交互式命令时,调用shell类中的_recv_until函数,当_recv_until函数的指定状态为第一expect预设内容时,返回回显字符串;

当判定所执行的命令为非交互式命令时,调用shell类中的_recv_until函数,当_recv_until函数的指定状态为命令执行已结束时,返回回显字符串。例如,可以采用_is_cmd_done函数判断命令是否执行结束;

a40,执行第二execute函数,当第二execute函数中的第二expect为’0’时,调用_get_rc获取返回码,并检查返回码是否为noeer_rc,若否,则进行报错;

a50,调用_wash_rs清洗回显字符串,将清洗后的字符串作为返回值返回。完成交互命令的执行。

根据本发明实施例的计算机存储介质,计算机存储介质上存储有计算机程序,计算机程序被处理器执行时实现如上述的基于paramiko的交互式命令执行方法的步骤,具体包括:

a10,基于shell类,定义execute函数,包括:第一execute函数和第二execute函数;

a20,执行第一execute函数,并基于第一execute函数中的第一expect判断所执行的命令是非交互式命令还是交互式命令;

其中,当第一expect为’0’或”时,则判定所执行的命令为非交互式命令,当第一expect为’0’和”外的其他内容时,则判定所执行的命令为交互式命令。

a30,当判定所执行的命令为交互式命令时,调用shell类中的_recv_until函数,当_recv_until函数的指定状态为第一expect预设内容时,返回回显字符串;

a40,执行第二execute函数,当第二execute函数中的第二expect为’0’时,调用_get_rc获取返回码,并检查返回码是否为noeer_rc,若否,则进行报错;

a50,调用_wash_rs清洗回显字符串,将清洗后的字符串作为返回值返回。完成交互命令的执行。

下面参照附图以一个具体的实施例详细描述根据本发明的基于paramiko的交互式命令执行方法及装置。值得理解的是,下述描述仅是示例性描述,而不应理解为对本发明的具体限制。

ssh是一种加密的网络传输协议,在ssh诞生之前,人们更多地使用telnet协议进行远程登录和执行命令,但是由于telnet协议使用明文传输数据,因此,存在着很大的安全性问题,相比之下,ssh协议则对数据进行加密后再传输,提高了数据传输的安全性。

ssh只是一个协议,不同的编程语言再对其进行具体的实现。paramiko则是python语言中使用最为广泛的ssh协议实现,通常在程序中使用其进行远程登录和执行命令。paramiko执行命令是通过其channel类的exec_command方法实现,该方法则是通过向连接到服务端的channel发送一个类型为“exec”的消息,并携带命令行字符串,来实现远程执行命令的操作。但是根据ssh协议规定,该类型消息只能携带一个非交互式的命令,即执行过程不需用户再输入其他信息的命令,如果携带的是一个交互式命令,则执行过程会卡在等待用户输入的步骤始终不能结束。

为了解决上述问题,本发明提出一种通过paramiko的channel类的send和recv方法来实现一种既可以执行非交互式命令,也可以执行交互式命令的装置,即一个名为shell的类,该类提供一个名为execute的方法用于执行命令。

具体的说,本发明即为一个名为shell的类,该类最主要的属性及方法如下图所示:

shell类的最核心的方法为execute,其他的以一个下划线“_”开头的方法表示为该类的内部方法,仅供内部使用,这些内部方法都是为了execute服务的,所以本发明最关键的点在于execute方法如何实现,execute的定义如下:

defexecute(self,command,expect=’0’,timeout=10,chan=none);

其中,参数self:python语言中类方法第一个参数固定格式,表示类实例本身;

参数command:待执行的命令字符串;

参数expect:期望字符串,‘0’表示期望无错误,‘’表示期望命令执行完成但是不检查是否有错,其他表示期望回显中出现指定的内容;

参数timeout:命令超时时间,单位秒,如果该时间内命令还未结束则会被强制结束;

参数chan:指定channel名称,一个channel相当于一个终端,如果不指定则使用默认channel;

execute执行方法的流程如图2所示。为了便于理解,下面以三个具体的例子进行展示:

执行一个非交互式命令并检查是否执行出错:

execute(‘mkdir/home/me/newdir’,expect=’0’)

执行一个非交互式命令但不检查是否执行出错:

execute(‘cd/not/exist/dir’,expect=”)

执行一个交互式的命令:

execute(‘rm-itestfile’,expect=”removeregularfile‘testfile’?“)

execute(‘y’,expect=’0’)

综上所述,在任何一种命令行中,交互式命令的使用都是不可完全避免的,如果无法通过程序执行交互式命令,则导致很多操作无法通过程序实现,带来了很大的不便性,由于本发明能够同时执行用于执行交互式和非交互式的命令,避免了paramiko不能执行交互式命令所带来的不便性,使用其可以大大提高通过程序实现对远程服务器的自动化控制程度。

通过具体实施方式的说明,应当可对本发明为达成预定目的所采取的技术手段及功效得以更加深入且具体的了解,然而所附图示仅是提供参考与说明之用,并非用来对本发明加以限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1