使用示例(使用了默认用户root,和默认端口号22):

./mooon_ssh --h=192.168.4.1,192.168.4.2 -P=password -c='cat /etc/hosts'

#include "mooon/net/libssh2.h" // 提供远程执行命令接口
#include "mooon/sys/error.h"
#include "mooon/sys/stop_watch.h"
#include "mooon/utils/args_parser.h"
#include "mooon/utils/print_color.h"
#include "mooon/utils/string_utils.h"
#include "mooon/utils/tokener.h"
#include <iostream> // 被执行的命令,可为一条或多条命令,如:ls /&&whoami
STRING_ARG_DEFINE(c, "", "command to execute remotely");
// 逗号分隔的远程主机列表
STRING_ARG_DEFINE(h, "", "remote hosts");
// 远程主机的sshd端口号
INTEGER_ARG_DEFINE(uint16_t, p, 22, 10, 65535, "remote hosts port");
// 用户名
STRING_ARG_DEFINE(u, "root", "remote host user");
// 密码
STRING_ARG_DEFINE(P, "", "remote host password"); // 连接超时,单位为秒
INTEGER_ARG_DEFINE(uint16_t, t, 10, 1, 65535, "timeout seconds to remote host"); // 结果信息
struct ResultInfo
{
bool success; // 为true表示执行成功
std::string ip; // 远程host的IP地址
uint32_t seconds; // 运行花费的时长,精确到秒 ResultInfo()
: success(false), seconds(0)
{
} std::string str() const
{
std::string tag = success? "SUCCESS": "FAILURE";
return mooon::utils::CStringUtils::format_string("[%s %s]: %u seconds", ip.c_str(), tag.c_str(), seconds);
}
}; inline std::ostream& operator <<(std::ostream& out, const struct ResultInfo& result)
{
std::string tag = result.success? "SUCCESS": "FAILURE";
out << "["PRINT_COLOR_YELLOW << result.ip << PRINT_COLOR_NONE" " << tag << "] " << result.seconds << " seconds";
return out;
} // 使用示例:
// 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'
int main(int argc, char* argv[])
{
// 解析命令行参数
std::string errmsg;
if (!mooon::utils::parse_arguments(argc, argv, &errmsg))
{
fprintf(stderr, "parameter error: %s\n", errmsg.c_str());
exit(1);
} uint16_t port = mooon::argument::p->value();
std::string commands = mooon::argument::c->value();
std::string hosts = mooon::argument::h->value();
std::string user = mooon::argument::u->value();
std::string password = mooon::argument::P->value();
mooon::utils::CStringUtils::trim(commands);
mooon::utils::CStringUtils::trim(hosts);
mooon::utils::CStringUtils::trim(user);
mooon::utils::CStringUtils::trim(password); // 检查参数(-c)
if (commands.empty())
{
fprintf(stderr, "parameter[-c]'s value not set\n");
exit(1);
} // 检查参数(-h)
if (hosts.empty())
{
// 尝试从环境变量取值
const char* hosts_ = getenv("HOSTS");
if (NULL == hosts_)
{
fprintf(stderr, "parameter[-h]'s value not set\n");
exit(1);
} hosts= hosts_;
mooon::utils::CStringUtils::trim(hosts);
if (hosts.empty())
{
fprintf(stderr, "parameter[-h]'s value not set\n");
exit(1);
}
} // 检查参数(-u)
if (user.empty())
{
fprintf(stderr, "parameter[-u]'s value not set\n");
exit(1);
} // 检查参数(-P)
if (password.empty())
{
fprintf(stderr, "parameter[-P]'s value not set\n");
exit(1);
} std::vector<std::string> hosts_ip;
const std::string& remote_hosts_ip = hosts;
int num_remote_hosts_ip = mooon::utils::CTokener::split(&hosts_ip, remote_hosts_ip, ",", true);
if (0 == num_remote_hosts_ip)
{
fprintf(stderr, "parameter[-h] error\n");
exit(1);
} std::vector<struct ResultInfo> results(num_remote_hosts_ip);
for (int i=0; i<num_remote_hosts_ip; ++i)
{
bool color = true;
int num_bytes = 0;
int exitcode = 0;
std::string exitsignal;
std::string errmsg;
const std::string& remote_host_ip = hosts_ip[i];
results[i].ip = remote_host_ip; fprintf(stdout, "["PRINT_COLOR_YELLOW"%s"PRINT_COLOR_NONE"]\n", remote_host_ip.c_str());
fprintf(stdout, PRINT_COLOR_GREEN); mooon::sys::CStopWatch stop_watch;
try
{
mooon::net::CLibssh2 libssh2(remote_host_ip, port, user, password, mooon::argument::t->value()); libssh2.remotely_execute(commands, std::cout, &exitcode, &exitsignal, &errmsg, &num_bytes);
fprintf(stdout, PRINT_COLOR_NONE);
color = false; // color = true; if ((0 == exitcode) && exitsignal.empty())
{
results[i].success = true;
fprintf(stdout, "["PRINT_COLOR_YELLOW"%s"PRINT_COLOR_NONE"] SUCCESS\n", remote_host_ip.c_str());
}
else
{
results[i].success = false; if (exitcode != 0)
{
fprintf(stderr, "%d: %s\n", exitcode, mooon::sys::Error::to_string(exitcode).c_str());
}
else if (!exitsignal.empty())
{
fprintf(stderr, "%s: %s\n", exitsignal.c_str(), errmsg.c_str());
}
}
}
catch (mooon::sys::CSyscallException& ex)
{
if (color)
fprintf(stdout, PRINT_COLOR_NONE); // color = true; fprintf(stderr, "["PRINT_COLOR_RED"%s"PRINT_COLOR_NONE"] failed: %s\n", remote_host_ip.c_str(), ex.str().c_str());
}
catch (mooon::utils::CException& ex)
{
if (color)
fprintf(stdout, PRINT_COLOR_NONE); // color = true; fprintf(stderr, "["PRINT_COLOR_RED"%s"PRINT_COLOR_NONE"] failed: %s\n", remote_host_ip.c_str(), ex.str().c_str());
} results[i].seconds = stop_watch.get_elapsed_microseconds() / 1000000;
std::cout << std::endl;
} // for // 输出总结
std::cout << std::endl;
std::cout << "================================" << std::endl;
int num_success = 0; // 成功的个数
int num_failure = 0; // 失败的个数
for (std::vector<struct ResultInfo>::size_type i=0; i<results.size(); ++i)
{
const struct ResultInfo& result_info = results[i];
std::cout << result_info << std::endl; if (result_info.success)
++num_success;
else
++num_failure;
}
std::cout << "SUCCESS: " << num_success << ", FAILURE: " << num_failure << std::endl; return 0;
}

批量远程执行shell命令工具的更多相关文章

  1. Linux远程执行Shell命令或脚本

    ## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh root@192.168.1.1 'uptime' ## 远程执行本地shell脚本 ...

  2. Linux远程执行shell命令

    Linux远程执行shell命令   在Linux系统中,我们经常想在A机器上,执行B机器上的SHELL命令. 下面这种方案,是一种流行可靠的方案. 1.SSH无密码登录 # 本地服务器执行(A机器) ...

  3. Java远程执行Shell命令

    1. Jar包:ganymed-ssh2-build210.jar 2. 步骤: a) 连接: Connection conn = new Connection(ipAddr); conn.conne ...

  4. Python ssh 远程执行shell命令

    工具 python paramiko 远程执行命令 import paramiko ssh = paramiko.SSHClient() key = paramiko.AutoAddPolicy() ...

  5. Java SSH远程执行Shell命令、shell脚本实现(Ganymed SSH)

    jar包下载地址: http://www.ganymed.ethz.ch/ssh2/ 此源码的好处就是没有依赖很多其他的包,拷贝过来干干净净.具体代码实现可以看下文,或参考官方文档,在下载的压缩包里g ...

  6. 使用JSch远程执行shell命令

    package com.nihaorz.jsch; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import ...

  7. 第3节 sqoop:7、通过java代码远程连接linux执行shell命令

    数据库的数据同步软件sqoop 数据同步 关系型数据库到大数据平台 任务:sqoop 是批量导入数据太慢,如何做到实时的数据同步 实时的数据同步工具: canal 阿里开源的一个数据库数据实时同步的软 ...

  8. expect脚本同步文件 expect脚本指定host和要同步的文件 构建文件分发系统 批量远程执行命令

    自动同步文件 #!/usr/bin/expect set " spawn rsync -av root@.txt /tmp/ expect { "yes/no" { se ...

  9. expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统、批量远程执行命令

    7月20日任务 20.31 expect脚本同步文件20.32 expect脚本指定host和要同步的文件20.33 构建文件分发系统20.34 批量远程执行命令扩展:shell多线程 http:// ...

随机推荐

  1. python 文件移动

    python实现文件移动: import shutil shutil.move("original_path", "new_folder") # move fi ...

  2. eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法

    关于 eclipse启动卡死的问题(eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法),自己常用的解决方法: 方案一(推荐使用,如果没有这个文件,就使用方案二): 到<works ...

  3. Packed with amazing data about the world in 201

    Only those who have the patience to do simple things,perfectly ever acquire the skill to do difficul ...

  4. Scala语言学习笔记(2)

    表达式,值,变量,代码块,函数,方法 // 表达式 1 + 1 println(1 + 1) // 2 // 值(values)使用 val 关键字声明,带初值时类型可省略. val x = 1 + ...

  5. 关于struts2输出excel表

    web.xml: <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com ...

  6. java heap space解决方法和JVM参数设置

    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...

  7. websoket

    http://blog.csdn.net/xueling022/article/details/52902358

  8. 用NBU无法还原数据库到ASM磁盘

    描述:用NBU无法还原数据库到ASM磁盘,却可以还原到数据库本地磁盘 错误提示: ORA-15025: could not open disk "/dev/mapper/DATA1" ...

  9. Telephone interview with Youyou Tu

    "Good News for the National Holiday!" Telephone interview with Youyou Tu following the ann ...

  10. 45. Jump Game II (Array; Two-Pointers,Greedy)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...