19.4 Boost Asio 远程命令执行
【摘要】 命令执行机制的实现与原生套接字通信一致,仅仅只是在调用时采用了Boost通用接口,在服务端中我们通过封装实现一个run_command函数,该函数用于发送一个字符串命令,并循环等待接收客户端返回的字符串,当接收到结束标志goodbye lyshark时则说明数据传输完成则退出,客户端使用exec_command函数,该函数通过_popen函数执行一条命令,并循环fgets读取字符串发送给服务...
命令执行机制的实现与原生套接字通信一致,仅仅只是在调用时采用了Boost通用接口,在服务端中我们通过封装实现一个run_command
函数,该函数用于发送一个字符串命令,并循环等待接收客户端返回的字符串,当接收到结束标志goodbye lyshark
时则说明数据传输完成则退出,客户端使用exec_command
函数,该函数通过_popen
函数执行一条命令,并循环fgets
读取字符串发送给服务端,最终传输一个结束标志完成通信。
服务端代码如下所示,我们通过调用run_command
函数执行dir C:\\Users\\
命令,获取到对端主机目录下的文件列表。
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace boost::asio;
// 让客户端执行特定命令
bool run_command(ip::tcp::socket *socket, std::string command)
{
(*socket).write_some(buffer(command));
char buffer[1024] = { 0 };
while ((*socket).read_some(boost::asio::buffer(buffer, 1024)) > 0)
{
if (strncmp(buffer, "goodbye lyshark", 15) == 0)
break;
std::cout << buffer;
memset(buffer, 0, sizeof(buffer));
}
return true;
}
int main(int argc,char *argv[])
{
io_service io_service;
ip::tcp::endpoint ep(ip::tcp::v4(), 6666);
ip::tcp::acceptor acceptor(io_service, ep);
ip::tcp::socket socket(io_service);
acceptor.accept(socket);
std::cout << "client:" << socket.remote_endpoint().address() << std::endl;
run_command(&socket, "dir C:\\Users\\");
std::system("pause");
return 0;
}
客户端代码如下所示exec_command
函数当收到命令时,自动执行远程命令,并将返回结果传输给服务端,如下所示;
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace boost::asio;
// 实现命令执行,并发送到服务端
bool exec_command(ip::tcp::socket *socket)
{
char command[1024] = { 0 };
char buffer[1024] = { 0 };
(*socket).read_some(boost::asio::buffer(command));
FILE *fp = _popen(command, "r");
while (fgets(buffer, sizeof(buffer), fp) != NULL)
{
(*socket).write_some(boost::asio::buffer(buffer, 1024));
memset(buffer, 0, sizeof(buffer));
}
(*socket).write_some(boost::asio::buffer("goodbye lyshark"));
_pclose(fp);
return true;
}
int main(int argc, char *argv[])
{
io_service io_service;
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 6666);
ip::tcp::socket socket(io_service);
socket.connect(ep);
exec_command(&socket);
std::system("pause");
return 0;
}
读者可自行运行上述代码,至此则可输出如下图所示的效果;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)