批量远程执行shell命令工具

简介: 使用示例(使用了默认用户root,和默认端口号22): ./mooon_ssh --h=192.168.4.1,192.168.4.2 -P=password -c='cat /etc/hosts' #include "mooon/net/libssh2.
使用示例(使用了默认用户root,和默认端口号22):
./mooon_ssh --h=192.168.4.1,192.168.4.2 -P=password -c='cat /etc/hosts'


  1. #include "mooon/net/libssh2.h" // 提供远程执行命令接口
  2. #include "mooon/sys/error.h"
  3. #include "mooon/sys/stop_watch.h"
  4. #include "mooon/utils/args_parser.h"
  5. #include "mooon/utils/print_color.h"
  6. #include "mooon/utils/string_utils.h"
  7. #include "mooon/utils/tokener.h"
  8. #include iostream>

  9. // 被执行的命令,可为一条或多条命令,如:ls /&&whoami
  10. STRING_ARG_DEFINE(c, "", "command to execute remotely");
  11. // 逗号分隔的远程主机列表
  12. STRING_ARG_DEFINE(h, "", "remote hosts");
  13. // 远程主机的sshd端口号
  14. INTEGER_ARG_DEFINE(uint16_t, p, 22, 10, 65535, "remote hosts port");
  15. // 用户名
  16. STRING_ARG_DEFINE(u, "root", "remote host user");
  17. // 密码
  18. STRING_ARG_DEFINE(P, "", "remote host password");

  19. // 连接超时,单位为秒
  20. INTEGER_ARG_DEFINE(uint16_t, t, 10, 1, 65535, "timeout seconds to remote host");

  21. // 结果信息
  22. struct ResultInfo
  23. {
  24.     bool success; // 为true表示执行成功
  25.     std::string ip; // 远程host的IP地址
  26.     uint32_t seconds; // 运行花费的时长,精确到秒

  27.     ResultInfo()
  28.         : success(false), seconds(0)
  29.     {
  30.     }

  31.     std::string str() const
  32.     {
  33.         std::string tag = success? "SUCCESS": "FAILURE";
  34.         return mooon::utils::CStringUtils::format_string("[%s %s]: %u seconds", ip.c_str(), tag.c_str(), seconds);
  35.     }
  36. };

  37. inline std::ostream& operator (std::ostream& out, const struct ResultInfo& result)
  38. {
  39.     std::string tag = result.success? "SUCCESS": "FAILURE";
  40.     out "["PRINT_COLOR_YELLOW result.ip PRINT_COLOR_NONE" " tag "] " result.seconds " seconds";
  41.     return out;
  42. }

  43. // 使用示例:
  44. // mooon_ssh -u=root -P=test -p=2016 -h="127.0.0.1,192.168.0.1" -c='ls /tmp&&ps aux|grep -c test'
  45. int main(int argc, char* argv[])
  46. {
  47.     // 解析命令行参数
  48.     std::string errmsg;
  49.     if (!mooon::utils::parse_arguments(argc, argv, &errmsg))
  50.     {
  51.         fprintf(stderr, "parameter error: %s\n", errmsg.c_str());
  52.         exit(1);
  53.     }

  54.     uint16_t port = mooon::argument::p->value();
  55.     std::string commands = mooon::argument::c->value();
  56.     std::string hosts = mooon::argument::h->value();
  57.     std::string user = mooon::argument::u->value();
  58.     std::string password = mooon::argument::P->value();
  59.     mooon::utils::CStringUtils::trim(commands);
  60.     mooon::utils::CStringUtils::trim(hosts);
  61.     mooon::utils::CStringUtils::trim(user);
  62.     mooon::utils::CStringUtils::trim(password);

  63.     // 检查参数(-c)
  64.     if (commands.empty())
  65.     {
  66.         fprintf(stderr, "parameter[-c]'s value not set\n");
  67.         exit(1);
  68.     }

  69.     // 检查参数(-h)
  70.     if (hosts.empty())
  71.     {
  72.         // 尝试从环境变量取值
  73.         const char* hosts_ = getenv("HOSTS");
  74.         if (NULL == hosts_)
  75.         {
  76.             fprintf(stderr, "parameter[-h]'s value not set\n");
  77.             exit(1);
  78.         }

  79.         hosts= hosts_;
  80.         mooon::utils::CStringUtils::trim(hosts);
  81.         if (hosts.empty())
  82.         {
  83.             fprintf(stderr, "parameter[-h]'s value not set\n");
  84.             exit(1);
  85.         }
  86.     }

  87.     // 检查参数(-u)
  88.     if (user.empty())
  89.     {
  90.         fprintf(stderr, "parameter[-u]'s value not set\n");
  91.         exit(1);
  92.     }

  93.     // 检查参数(-P)
  94.     if (password.empty())
  95.     {
  96.         fprintf(stderr, "parameter[-P]'s value not set\n");
  97.         exit(1);
  98.     }

  99.     std::vectorstd::string> hosts_ip;
  100.     const std::string& remote_hosts_ip = hosts;
  101.     int num_remote_hosts_ip = mooon::utils::CTokener::split(&hosts_ip, remote_hosts_ip, ",", true);
  102.     if (0 == num_remote_hosts_ip)
  103.     {
  104.         fprintf(stderr, "parameter[-h] error\n");
  105.         exit(1);
  106.     }

  107.     std::vectorstruct ResultInfo> results(num_remote_hosts_ip);
  108.     for (int i=0; inum_remote_hosts_ip; ++i)
  109.     {
  110.         bool color = true;
  111.         int num_bytes = 0;
  112.         int exitcode = 0;
  113.         std::string exitsignal;
  114.         std::string errmsg;
  115.         const std::string& remote_host_ip = hosts_ip[i];
  116.         results[i].ip = remote_host_ip;

  117.         fprintf(stdout, "["PRINT_COLOR_YELLOW"%s"PRINT_COLOR_NONE"]\n", remote_host_ip.c_str());
  118.         fprintf(stdout, PRINT_COLOR_GREEN);

  119.         mooon::sys::CStopWatch stop_watch;
  120.         try
  121.         {
  122.             mooon::net::CLibssh2 libssh2(remote_host_ip, port, user, password, mooon::argument::t->value());

  123.             libssh2.remotely_execute(commands, std::cout, &exitcode, &exitsignal, &errmsg, &num_bytes);
  124.             fprintf(stdout, PRINT_COLOR_NONE);
  125.             color = false; // color = true;

  126.             if ((0 == exitcode) && exitsignal.empty())
  127.             {
  128.                 results[i].success = true;
  129.                 fprintf(stdout, "["PRINT_COLOR_YELLOW"%s"PRINT_COLOR_NONE"] SUCCESS\n", remote_host_ip.c_str());
  130.             }
  131.             else
  132.             {
  133.                 results[i].success = false;

  134.                 if (exitcode != 0)
  135.                 {
  136.                     fprintf(stderr, "%d: %s\n", exitcode, mooon::sys::Error::to_string(exitcode).c_str());
  137.                 }
  138.                 else if (!exitsignal.empty())
  139.                 {
  140.                     fprintf(stderr, "%s: %s\n", exitsignal.c_str(), errmsg.c_str());
  141.                 }
  142.             }
  143.         }
  144.         catch (mooon::sys::CSyscallException& ex)
  145.         {
  146.             if (color)
  147.                 fprintf(stdout, PRINT_COLOR_NONE); // color = true;

  148.             fprintf(stderr, "["PRINT_COLOR_RED"%s"PRINT_COLOR_NONE"] failed: %s\n", remote_host_ip.c_str(), ex.str().c_str());
  149.         }
  150.         catch (mooon::utils::CException& ex)
  151.         {
  152.             if (color)
  153.                 fprintf(stdout, PRINT_COLOR_NONE); // color = true;

  154.             fprintf(stderr, "["PRINT_COLOR_RED"%s"PRINT_COLOR_NONE"] failed: %s\n", remote_host_ip.c_str(), ex.str().c_str());
  155.         }

  156.         results[i].seconds = stop_watch.get_elapsed_microseconds() / 1000000;
  157.         std::cout std::endl;
  158.     } // for

  159.     // 输出总结
  160.     std::cout std::endl;
  161.     std::cout "================================" std::endl;
  162.     int num_success = 0; // 成功的个数
  163.     int num_failure = 0; // 失败的个数
  164.     for (std::vectorstruct ResultInfo>::size_type i=0; iresults.size(); ++i)
  165.     {
  166.         const struct ResultInfo& result_info = results[i];
  167.         std::cout result_info std::endl;

  168.         if (result_info.success)
  169.             ++num_success;
  170.         else
  171.             ++num_failure;
  172.     }
  173.     std::cout "SUCCESS: " num_success ", FAILURE: " num_failure std::endl;

  174.     return 0;
  175. }

相关文章
|
29天前
|
人工智能 Shell iOS开发
AI Shell:在命令行里“对话” AI ,微软推出将 AI 助手引入命令行的 CLI 工具,打造对话式交互命令行
AI Shell 是一款强大的 CLI 工具,将人工智能直接集成到命令行中,帮助用户提高生产力。AI Shell 支持多种 AI 模型和助手,通过多代理框架提供丰富的功能和灵活的使用模式。
97 7
|
1月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
42 1
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
78 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
2月前
|
Shell 知识图谱
Shell printf 命令
10月更文挑战第3天
25 1
|
2月前
|
Unix Shell Linux
常见的shell命令
shell常用命令
58 11
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
143 5
|
2月前
|
Shell PHP
Shell echo命令
10月更文挑战第3天
23 0
|
2月前
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
228 0
|
2月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
88 0
下一篇
DataWorks