前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >19.4 Boost Asio 远程命令执行

19.4 Boost Asio 远程命令执行

作者头像
微软技术分享
发布2023-11-03 08:17:08
1510
发布2023-11-03 08:17:08
举报

命令执行机制的实现与原生套接字通信一致,仅仅只是在调用时采用了Boost通用接口,在服务端中我们通过封装实现一个run_command函数,该函数用于发送一个字符串命令,并循环等待接收客户端返回的字符串,当接收到结束标志goodbye lyshark时则说明数据传输完成则退出,客户端使用exec_command函数,该函数通过_popen函数执行一条命令,并循环fgets读取字符串发送给服务端,最终传输一个结束标志完成通信。

服务端代码如下所示,我们通过调用run_command函数执行dir C:\\Users\\命令,获取到对端主机目录下的文件列表。

代码语言:javascript
复制
#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函数当收到命令时,自动执行远程命令,并将返回结果传输给服务端,如下所示;

代码语言:javascript
复制
#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;
}

读者可自行运行上述代码,至此则可输出如下图所示的效果;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档