一种基于MQTT的远程终端交互方法和系统与流程
未命名
10-09
阅读:97
评论:0
一种基于mqtt的远程终端交互方法和系统
技术领域
1.本发明提出了一种基于mqtt的远程终端交互方法和系统,属于远程通信技术领域。
背景技术:
2.mqtt(message queuing telemetry transport)是一种轻量级的消息传输协议,通常用于物联网(iot)设备之间的通信。它基于发布/订阅模式,其中客户端可以发布(发送)消息到一个主题(topic),其他客户端则可以订阅该主题以接收消息。mqtt协议使用tcp/ip协议栈来传输消息,具有低开销、可靠、安全等特点,因此被广泛应用于各种物联网场景。现有技术中的mqtt的远程终端需要目标设备配置ssh-server服务,并且,目标有能访问的ip,这在物联网场景中缺乏可行性的。
技术实现要素:
3.本发明提供了一种基于mqtt的远程终端交互方法和系统,用以解决现有技术中需要目标设备配置ssh-server服务,并且,目标有能访问的ip,这在物联网场景中缺乏可行性的问题,所采取的技术方案如下:
4.一种基于mqtt的远程终端交互方法,所述远程终端交互方法包括:
5.使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;
6.通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接;
7.使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,避免执行禁止的命令;通过输入和输出缓冲,减少网络请求导致的输入和输出延迟,提高用户体验。
8.在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。
9.进一步地,使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控,包括:
10.步骤1、调用openpty()函数创建个伪终端设备,每创建一个为终端设备则获取返回两个文件描述符,一个所述文件描述符用于主控制终端(master_fd),另一个所述文件描述符用于从控制终端(slave_fd);
11.步骤2、调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;
12.步骤3、在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;
13.步骤4、在父进程中关闭slave_fd,因为父进程不需要从该文件描述符中读取或写入数据;
14.使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;在本实施例中,只需要监视主控制终
端的输入事件(pollin);
15.步骤5、调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端(master_fd)中读取数据,并将其存储在缓冲区(buf)中;处理从主控制终端读取的数据,例如将其输出到标准输出。
16.步骤6、重复执行步骤3-5,直到不再需要监视文件描述符。在本例中,可以使用waitpid()函数等待子进程的结束,然后关闭主控制终端(master_fd)。
17.进一步地,所述通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接,包括:
18.引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例。
19.在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码。
20.使用mqtt客户端实例连接到中介服务器。
21.进一步地,使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,包括:
22.利用命令行解释器(shell)获取用户输入的命令;具体的,在shell中,用户输入命令后,shell将其解析并执行相应的命令。因此,需要在shell中添加一个封装层,用于检查用户输入的命令是否允许执行。
23.在封装层中提取获取当前系统中允许执行的命令列表;具体的,在封装层中,需要获取当前系统中允许执行的命令列表。这个列表通常被保存在环境变量path中,它包含了系统中所有可执行程序所在的路径。可以使用系统调用如getenv()或者通过执行echo$path命令来获取该列表。
24.在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行。
25.根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。具体的,如果目标命令是合法的,则可以在封装层中调用系统调用,例如execve(),来执行该命令。在执行目标命令时,需要注意参数传递、环境变量等问题,以确保正确执行命令。
26.通过上述步骤,可以在命令行解释器(shell)中添加一个封装层,用于检查用户输入的命令是否合法,并且仅执行合法的命令。这样可以有效地保护系统的安全性和稳定性。
27.一种基于mqtt的远程终端交互系统,所述远程终端交互系统包括:
28.终端建立模块,用于使用forkpty()创建虚拟终端,并使用execl执行/bin/bash来替代fork出的新终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;
29.连接建立模块,用于通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接;
30.命令获取模块,用于使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,避免执行禁止的命令;通过输入和输出缓冲,
减少网络请求导致的输入和输出延迟,提高用户体验。
31.命令执行模块,用于在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。
32.进一步地,所述终端建立模块包括:
33.第一调用模块,用于调用openpty()函数创建个伪终端设备,每创建一个为终端设备则获取返回两个文件描述符,一个所述文件描述符用于主控制终端(master_fd),另一个所述文件描述符用于从控制终端(slave_fd);
34.第二调用模块,用于调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;
35.读取模块,用于在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;
36.设置模块,用于在父进程中关闭slave_fd,因为父进程不需要从该文件描述符中读取或写入数据;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;在本实施例中,只需要监视主控制终端的输入事件(pollin);
37.第三调用模块,用于调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端(master_fd)中读取数据,并将其存储在缓冲区(buf)中;处理从主控制终端读取的数据,例如将其输出到标准输出。
38.重复模块,用于重复执行步骤读取模块、设置模块和第三调用模块,直到不再需要监视文件描述符。在本例中,可以使用waitpid()函数等待子进程的结束,然后关闭主控制终端(master_fd)。
39.进一步地,所述连接建立模块包括:
40.引入模块,用于引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例。
41.参数设置模块,用于在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码。
42.连接模块,用于使用mqtt客户端实例连接到中介服务器。
43.进一步地,所述命令获取模块包括:
44.输入命令获取模块,用于利用命令行解释器(shell)获取用户输入的命令;具体的,在shell中,用户输入命令后,shell将其解析并执行相应的命令。因此,需要在shell中添加一个封装层,用于检查用户输入的命令是否允许执行。
45.列表获取模块,用于在封装层中提取获取当前系统中允许执行的命令列表;具体的,在封装层中,需要获取当前系统中允许执行的命令列表。这个列表通常被保存在环境变量path中,它包含了系统中所有可执行程序所在的路径。可以使用系统调用如getenv()或者通过执行echo$path命令来获取该列表。
46.匹配模块,用于在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行。
47.目标命令执行模块,用于根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。具体的,如果目标命令是合法的,则可以在封装层中调用系统调用,例如execve(),来执行该命令。在执行目标命令时,需要注意参数传递、环境变量等问题,以确保正确执行命令。
48.通过上述步骤,可以在命令行解释器(shell)中添加一个封装层,用于检查用户输入的命令是否合法,并且仅执行合法的命令。这样可以有效地保护系统的安全性和稳定性。
49.本发明有益效果:
50.本发明提出了一种基于mqtt的远程终端交互方法和系统在物联网环境下更安全,并允许支持该mqtt功能的平台进行集中的操控与管理。通过虚拟终端窗口进行命令输入和执行,实现远程终端交互。通过mqtt协议建立虚拟终端与中介服务器之间的数据连接,实现远程命令控制和监控。使用封装层对命令进行检查,避免执行禁止的命令。在输入和输出之间设置缓冲区。
附图说明
51.图1为本发明所述方法的流程图;
52.图2为本发明所述系统的系统框图。
具体实施方式
53.以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
54.本发明实施例提出了一种基于mqtt的远程终端交互方法,如图1所示,所述远程终端交互方法包括:
55.s1、使用forkpty()创建虚拟终端,并使用execl执行/bin/bash来替代fork出的新终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;
56.s2、通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接;
57.s3、使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令;通过输入和输出缓冲,减少网络请求导致的输入和输出延迟,提高用户体验。
58.s4、在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。
59.上述技术方案的工作原理为:使用forkpty()函数可以创建一个新的虚拟终端并返回主/从端口描述符。然后,可以使用execl()函数将新的虚拟终端替换为/bin/bash,使其成为一个全新的终端。这个新的终端可以通过给定的文件描述符进行读写,并且可以使用poll()函数对该文件描述符进行监控,以便及时处理数据输入和输出。为了建立虚拟终端与mqtt中介服务器之间的数据连接,需要使用mqtt客户端库连接到mqtt中介服务器,并订阅或发布与虚拟终端相关的主题。当在虚拟终端中输入命令时,可以将其转换为消息并发布到mqtt中介服务器,而当从mqtt中介服务器收到与虚拟终端相关的消息时,可以将其解析为命令并在虚拟终端中执行。在虚拟终端的窗口中输入目标命令,并在虚拟终端中执
行该命令。当命令执行完毕后,可以将输出信息转换为消息并发布到mqtt中介服务器,以便后续处理。用户可以通过虚拟终端窗口实时查看命令的执行结果。
60.上述技术方案的效果为:使用forkpty()创建虚拟终端,并使用execl执行/bin/bash来替代fork出的新终端,可以在不依赖物理终端的情况下创建虚拟终端,从而实现远程终端交互。通过mqtt协议建立虚拟终端与中介服务器之间的数据连接,可以实现异地远程终端交互,并且具有较高的稳定性和安全性。使用封装层对命令行解释器输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,避免执行禁止的命令,可以保证用户的输入和执行的命令符合预期,并提高了系统的安全性。通过输入和输出缓冲,减少网络请求导致的输入和输出延迟,提高用户体验,使用户能够更加流畅地输入和执行命令,并获得及时的输出结果。在虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果,可以实现用户与远程终端之间的实时交互,提高了远程终端的实用性和易用性。
61.本发明的一个实施例,使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控,包括:
62.步骤1、调用openpty()函数创建个伪终端设备;
63.步骤2、调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;
64.步骤3、在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;
65.步骤4、在父进程中关闭slave_fd;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;
66.步骤5、调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端(master_fd)中读取数据,并将其存储在缓冲区(buf)中;
67.步骤6、重复执行步骤3-5,直到不再需要监视文件描述符。
68.上述技术方案的工作原理为:调用openpty()函数创建个伪终端设备,每创建一个为终端设备则获取返回两个文件描述符,一个所述文件描述符用于主控制终端(master_fd),另一个所述文件描述符用于从控制终端(slave_fd);调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;在父进程中关闭slave_fd,因为父进程不需要从该文件描述符中读取或写入数据;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;在本实施例中,只需要监视主控制终端的输入事件(pollin);调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端(master_fd)中读取数据,并将其存储在缓冲区(buf)中;处理从主控制终端读取的数据,例如将其输出到标准输出。重复执行上述步骤,直到不再需要监视文件描述符。在本例中,可以使用waitpid()函数等待子进程的结束,然后关闭主控制终端(master_fd)。
69.上述技术方案的效果为:可以在一个虚拟终端上运行命令,并通过伪终端设备获取输入和输出。通过监视文件描述符,可以实现异步的输入输出操作,并且不会阻塞其他进程的执行。同时,该技术可以在父进程中控制子进程的运行,例如等待子进程结束后关闭主控制终端的文件描述符,避免资源的浪费。
70.本发明的一个实施例,所述通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接,包括:
71.s201、引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例。
72.s202、在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码。
73.s203、使用mqtt客户端实例连接到中介服务器。
74.上述技术方案的工作原理为:引入mqtt客户端库,这是一个现成的代码库,实现了mqtt协议的客户端功能。然后使用该库创建mqtt客户端实例,该实例包含了所有连接中介服务器所需的信息,例如broker的地址、端口、用户名和密码等。设置连接参数,以便与中介服务器建立连接。这些参数包括连接到的broker的地址、端口、用户名和密码等。这些参数用于建立与中介服务器的连接,以便发送和接收mqtt消息。使用mqtt客户端实例连接到中介服务器,这将使用先前设置的连接参数建立到broker的连接。当连接成功建立时,客户端将能够发送和接收mqtt消息,从而实现与broker的通信。使用mqtt客户端库可以方便地实现mqtt协议的客户端功能,并通过设置连接参数和使用mqtt客户端实例连接到中介服务器,可以建立到broker的连接并与其通信。
75.上述技术方案的效果为:引入mqtt客户端库并使用该库创建mqtt客户端实例可以实现在应用程序中与mqtt服务器进行通信的功能。通过设置连接参数,可以指定连接的mqtt服务器地址、端口、用户名和密码等信息,确保连接到正确的mqtt服务器。使用mqtt客户端实例连接到中介服务器可以保证应用程序能够与mqtt服务器进行稳定和可靠的通信,从而实现消息的发送和接收等功能。此技术效果是提高了应用程序的通信能力和可靠性,增强了应用程序的实用性。
76.本发明的一个实施例,使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,包括:
77.s301、利用命令行解释器(shell)获取用户输入的命令;
78.在封装层中提取获取当前系统中允许执行的命令列表;
79.s302、在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行。
80.s303、根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。
81.上述技术方案的工作原理为:利用命令行解释器(shell)获取用户输入的命令;具体的,在shell中,用户输入命令后,shell将其解析并执行相应的命令。因此,需要在shell中添加一个封装层,用于检查用户输入的命令是否允许执行。在封装层中提取获取当前系统中允许执行的命令列表;具体的,在封装层中,需要获取当前系统中允许执行的命令列表。这个列表通常被保存在环境变量path中,它包含了系统中所有可执行程序所在的路径。可以使用系统调用如getenv()或者通过执行echo$path命令来获取该列表。在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如
果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行。根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。具体的,如果目标命令是合法的,则可以在封装层中调用系统调用,例如execve(),来执行该命令。在执行目标命令时,需要注意参数传递、环境变量等问题,以确保正确执行命令。通过上述步骤,可以在命令行解释器(shell)中添加一个封装层,用于检查用户输入的命令是否合法,并且仅执行合法的命令。这样可以有效地保护系统的安全性和稳定性。
82.上述技术方案的效果为:能够对用户输入的命令进行过滤和检查,确保只有在允许的命令列表中的命令才能被执行,从而提高系统的安全性和稳定性。通过在封装层中对用户输入的命令进行匹配,可以减少系统被非法操作和攻击的风险,保护系统和用户的数据安全。同时,只有合法的命令才能被执行,可以降低系统出错的概率,提高系统的稳定性。
83.本发明实施例提出了一种基于mqtt的远程终端交互系统,如图2所述,所述远程终端交互系统包括:
84.终端建立模块,用于使用forkpty()创建虚拟终端,并使用execl执行/bin/bash来替代fork出的新终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;
85.连接建立模块,用于通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接;
86.命令获取模块,用于使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,避免执行禁止的命令;通过输入和输出缓冲,减少网络请求导致的输入和输出延迟,提高用户体验。
87.命令执行模块,用于在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。
88.上述技术方案的工作原理为:首先,通过终端建立模块使用forkpty()创建虚拟终端,并使用execl执行/bin/bash来替代fork出的新终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;
89.然后,利用连接建立模块通过mqtt协议建立所述虚拟终端与中介服务器(broker)之间的数据连接;
90.之后,采用命令获取模块使用封装层对命令行解释器(shell)输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,避免执行禁止的命令;通过输入和输出缓冲,减少网络请求导致的输入和输出延迟,提高用户体验。
91.最后,利用命令执行模块在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。
92.上述技术方案的效果为:使用forkpty()创建虚拟终端,并使用execl执行/bin/bash来替代fork出的新终端,可以在不依赖物理终端的情况下创建虚拟终端,从而实现远程终端交互。通过mqtt协议建立虚拟终端与中介服务器之间的数据连接,可以实现异地远程终端交互,并且具有较高的稳定性和安全性。使用封装层对命令行解释器输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,避免执行禁止的命令,可以保证用户的输入和执行的命令符合预期,并提高了系统的安全性。通过输入和输出缓冲,减少网络
请求导致的输入和输出延迟,提高用户体验,使用户能够更加流畅地输入和执行命令,并获得及时的输出结果。在虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果,可以实现用户与远程终端之间的实时交互,提高了远程终端的实用性和易用性。
93.本发明的一个实施例,所述终端建立模块包括:
94.第一调用模块,用于调用openpty()函数创建个伪终端设备,每创建一个为终端设备则获取返回两个文件描述符,一个所述文件描述符用于主控制终端(master_fd),另一个所述文件描述符用于从控制终端(slave_fd);
95.第二调用模块,用于调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;
96.读取模块,用于在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;
97.设置模块,用于在父进程中关闭slave_fd,因为父进程不需要从该文件描述符中读取或写入数据;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;在本实施例中,只需要监视主控制终端的输入事件(pollin);
98.第三调用模块,用于调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端(master_fd)中读取数据,并将其存储在缓冲区(buf)中;处理从主控制终端读取的数据,例如将其输出到标准输出。
99.重复模块,用于重复执行步骤读取模块、设置模块和第三调用模块,直到不再需要监视文件描述符。在本例中,可以使用waitpid()函数等待子进程的结束,然后关闭主控制终端(master_fd)。
100.上述技术方案的工作原理为:首先,通过第一调用模块调用openpty()函数创建个伪终端设备,每创建一个为终端设备则获取返回两个文件描述符,一个所述文件描述符用于主控制终端(master_fd),另一个所述文件描述符用于从控制终端(slave_fd);
101.然后,利用第二调用模块调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;
102.之后,采用读取模块在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;
103.随后,通过设置模块在父进程中关闭slave_fd,因为父进程不需要从该文件描述符中读取或写入数据;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;在本实施例中,只需要监视主控制终端的输入事件(pollin);
104.之后,采用第三调用模块调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端(master_fd)中读取数据,并将其存储在缓冲区(buf)中;处理从主控制终端读取的数据,例如将其输出到标准输出。
105.最后,利用重复模块重复执行步骤读取模块、设置模块和第三调用模块,直到不再需要监视文件描述符。在本例中,可以使用waitpid()函数等待子进程的结束,然后关闭主控制终端(master_fd)。
106.上述技术方案的效果为:可以在一个虚拟终端上运行命令,并通过伪终端设备获取输入和输出。通过监视文件描述符,可以实现异步的输入输出操作,并且不会阻塞其他进程的执行。同时,该技术可以在父进程中控制子进程的运行,例如等待子进程结束后关闭主控制终端的文件描述符,避免资源的浪费。
107.本发明的一个实施例,所述连接建立模块包括:
108.引入模块,用于引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例。
109.参数设置模块,用于在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码。
110.连接模块,用于使用mqtt客户端实例连接到中介服务器。
111.上述技术方案的工作原理为:首先,通过引入模块引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例。
112.然后,利用参数设置模块在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码。
113.最后,采用连接模块使用mqtt客户端实例连接到中介服务器。
114.上述技术方案的效果为:引入mqtt客户端库并使用该库创建mqtt客户端实例可以实现在应用程序中与mqtt服务器进行通信的功能。通过设置连接参数,可以指定连接的mqtt服务器地址、端口、用户名和密码等信息,确保连接到正确的mqtt服务器。使用mqtt客户端实例连接到中介服务器可以保证应用程序能够与mqtt服务器进行稳定和可靠的通信,从而实现消息的发送和接收等功能。此技术效果是提高了应用程序的通信能力和可靠性,增强了应用程序的实用性。
115.本发明的一个实施例,所述命令获取模块包括:
116.输入命令获取模块,用于利用命令行解释器(shell)获取用户输入的命令;具体的,在shell中,用户输入命令后,shell将其解析并执行相应的命令。因此,需要在shell中添加一个封装层,用于检查用户输入的命令是否允许执行。
117.列表获取模块,用于在封装层中提取获取当前系统中允许执行的命令列表;具体的,在封装层中,需要获取当前系统中允许执行的命令列表。这个列表通常被保存在环境变量path中,它包含了系统中所有可执行程序所在的路径。可以使用系统调用如getenv()或者通过执行echo$path命令来获取该列表。
118.匹配模块,用于在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行。
119.目标命令执行模块,用于根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。具体的,如果目标命令是合法的,则可以在封装层中调用系统调用,例如execve(),来执行该命令。在执行目标命令时,需要注意参数传递、环境变量等问题,以确保正确执行命令。
120.上述技术方案的工作原理为:首先,通过输入命令获取模块利用命令行解释器(shell)获取用户输入的命令;具体的,在shell中,用户输入命令后,shell将其解析并执行
相应的命令。因此,需要在shell中添加一个封装层,用于检查用户输入的命令是否允许执行。
121.然后,利用列表获取模块在封装层中提取获取当前系统中允许执行的命令列表;具体的,在封装层中,需要获取当前系统中允许执行的命令列表。这个列表通常被保存在环境变量path中,它包含了系统中所有可执行程序所在的路径。可以使用系统调用如getenv()或者通过执行echo$path命令来获取该列表。
122.之后,采用匹配模块在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行。
123.最后,通过目标命令执行模块根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。具体的,如果目标命令是合法的,则可以在封装层中调用系统调用,例如execve(),来执行该命令。在执行目标命令时,需要注意参数传递、环境变量等问题,以确保正确执行命令。
124.通过上述方式,可以在命令行解释器(shell)中添加一个封装层,用于检查用户输入的命令是否合法,并且仅执行合法的命令。这样可以有效地保护系统的安全性和稳定性。
125.上述技术方案的效果为:能够对用户输入的命令进行过滤和检查,确保只有在允许的命令列表中的命令才能被执行,从而提高系统的安全性和稳定性。通过在封装层中对用户输入的命令进行匹配,可以减少系统被非法操作和攻击的风险,保护系统和用户的数据安全。同时,只有合法的命令才能被执行,可以降低系统出错的概率,提高系统的稳定性。
126.显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
技术特征:
1.一种基于mqtt的远程终端交互方法,其特征这在于,所述远程终端交互方法包括:使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;通过mqtt协议建立所述虚拟终端与中介服务器之间的数据连接;使用封装层对命令行解释器输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令;在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。2.根据权利要求1所述远程终端交互方法,其特征这在于,使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控,包括:步骤1、调用openpty()函数创建个伪终端设备;步骤2、调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;步骤3、在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;步骤4、在父进程中关闭slave_fd;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;步骤5、调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端中读取数据,并将其存储在缓冲区中;步骤6、重复执行步骤3-5,直到不再需要监视文件描述符。3.根据权利要求1所述远程终端交互方法,其特征这在于,所述通过mqtt协议建立所述虚拟终端与中介服务器之间的数据连接,包括:引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例;在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码;使用mqtt客户端实例连接到中介服务器。4.根据权利要求1所述远程终端交互方法,其特征这在于,使用封装层对命令行解释器输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令,包括:利用命令行解释器获取用户输入的命令;在封装层中提取获取当前系统中允许执行的命令列表;在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行;根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。5.一种基于mqtt的远程终端交互系统,其特征这在于,所述远程终端交互系统包括:终端建立模块,用于使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;
连接建立模块,用于通过mqtt协议建立所述虚拟终端与中介服务器之间的数据连接;命令获取模块,用于使用封装层对命令行解释器输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令;命令执行模块,用于在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。6.根据权利要求5所述远程终端交互系统,其特征这在于,所述终端建立模块包括:第一调用模块,用于调用openpty()函数创建个伪终端设备;第二调用模块,用于调用fork()函数创建子进程,所述子进程用于在虚拟终端上运行命令;读取模块,用于在子进程中,使用dup2()函数将从slave_fd读取的数据发送到标准输入、输出和错误输出,并调用execl()函数在虚拟终端上运行预设的检测执行命令;设置模块,用于在父进程中关闭slave_fd;使用poll()函数监视文件描述符,设置timeout参数为等待时间,将要监视的文件描述符放入结构体数组中,并设置要监视的事件类型;第三调用模块,用于调用poll()函数等待输入事件发生;如果输入事件发生,则使用read()函数从主控制终端中读取数据,并将其存储在缓冲区中;重复模块,用于重复执行步骤读取模块、设置模块和第三调用模块,直到不再需要监视文件描述符。7.根据权利要求5所述远程终端交互系统,其特征这在于,所述连接建立模块包括:引入模块,用于引入mqtt客户端库,并使用所述mqtt客户端库创建mqtt客户端实例;参数设置模块,用于在mqtt客户端实例中设置mqtt客户端与所述中介服务器之间的连接参数,其中,所述连接参数包括broker的地址、端口、用户名和密码;连接模块,用于使用mqtt客户端实例连接到中介服务器。8.根据权利要求5所述远程终端交互系统,其特征这在于,所述命令获取模块包括:输入命令获取模块,用于利用命令行解释器获取用户输入的命令;列表获取模块,用于在封装层中提取获取当前系统中允许执行的命令列表;匹配模块,用于在封装层中,将用户输入的命令与可执行命令列表进行匹配,检查用户输入的命令是否允许执行;如果用户输入的命令在可执行命令列表中,则表示用户输入的命令是合法的,并允许被执行;如果用户输入的命令不在可执行命令列表中,则表示用户输入的命令是非法的,不能被执行;目标命令执行模块,用于根据所述用户输入的命令的合法性判断结果,确定所述用户输入的命令是否为目标命令,并对所述目标命令进行命令执行。
技术总结
本发明提出了一种基于MQTT的远程终端交互方法和系统。所述远程终端交互方法包括:使用forkpty()创建虚拟终端,所述虚拟终端通过给定的文件描述符进行读写,并在读写过程中使用poll对所述文件描述符进行监控;通过MQTT协议建立所述虚拟终端与中介服务器之间的数据连接;使用封装层对命令行解释器输入的命令进行检查,获取未被禁止的需要执行的命令作为目标命令;在所述虚拟终端的窗口中输入目标命令,并执行所述目标命令,输出执行结果。所述系统包括与所述方法步骤对应的模块。统包括与所述方法步骤对应的模块。统包括与所述方法步骤对应的模块。
技术研发人员:兰雨晴 余丹 孙中杰 邢智涣
受保护的技术使用者:慧之安信息技术股份有限公司
技术研发日:2023.05.30
技术公布日:2023/10/8
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
