単一のファイルを複数のマシンにアップロードするツール
使用例:
./mooon_upload -h=192.168.10.11,192.168.10.12 -p=6000 -u=root -P='root123' -s=./abc - d=/tmp/
は、ローカル ファイル ./abc を 2 つのマシン 192.168.10.11 および 192.168.10.12 の /tmp/ ディレクトリにアップロードすることを意味します
- #include "mooon/net/libssh2.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
- #include
- // リモートホストのカンマ区切りリスト
- STRING_ARG_DEFINE(h, "", "remote hosts port");
- // リモートホストの sshd ポート番号
- INTEGER_ARG_DEFINE(uint16_t, p, 22, 10, 65535, "remote hosts port");
- // ユーザー名
- STRING_ARG_DEFINE(u, "root", "リモートホストユーザー");
- // パスワード
- STRING_ARG_DEFINE(P, "", "リモートホストパスワード");
-
- //アップロードされたファイルのパス
- STRING_ARG_DEFINE(s, "", "アップロードされたソースファイル");
- // アップロード後にファイルが保存されるディレクトリのパス
- STRING_ARG_DEFINE (d, "", "保存するディレクトリ");
- // 秒単位の接続タイムアウト
- INTEGER_ARG_DEFINE(uint16_t, t, 10, 1, 65535, "リモートホストへのタイムアウト秒数");
- //結果情報
- struct ResultInfo
- {
- bool // Trueは実行が成功したことを示します
- //リモートホストのIPアドレス
;
- uint32_t 秒; // 実行にかかった時間、秒単位で正確です
- ResultInfo()
- : success(false)、秒(0)
- {
- }
-
- std::string str( ) const
- {
- std::stringタグ = 成功? "成功": "失敗";
- return mooon::utils::CStringUtils::format_string(" [%s %s]: %u 秒", ip.c_str(), tag.c_str(), 秒);
- }
- };
- inline std::ostream& 演算子 < <(std::ostream& out, const struct ResultInfo& result)
- {
- std::string tag = result.success?: "FAILURE";
- out << PRINT_COLOR_YELLOW << result.ip << PRINT_COLOR_NONE " << result.秒 < " 秒";
- }
- int main(int argc, char* argv[])
- {
- // コマンドラインパラメータを解析
- std::string errmsg;
- if (!mooon: :utils::parse_arguments(argc, argv , &errmsg))
- {
- fprintf(stderr, "パラメータ エラー: %sn", errmsg.c_str());
- exit(1);
- }
- uint 16_t port = mooon::argument::p->value();
- std::string ソース = mooon::argument::s->value();
- std::string ディレクトリ = mooon:: argument::d->value();
- std::string ホスト = mooon::argument::h->value();
- std::文字列ユーザー = mooon::argument::u ->value();
- std::string パスワード = mooon::argument::P->value();
- mooon::utils::CStringUtils ::trim(ソース);
- mooon::utils::CStringUtils::trim(ディレクトリ);
- mooon::utils::CStringUtils::trim(ホスト);
- mooon::utils:: CStringUtils::trim(user);
- mooon::utils::CStringUtils::trim(password);
- // パラメータをチェック (-s)
- if (source.empty())
- {
- fprintf(stderr , "parameter[-s] の値が設定されていません");
- exit(1);
- }
- // パラメータをチェックします (-d )
- if (directory.empty( ))
- {
- fprintf(stderr, "パラメータ[-d]の値が設定されていません");
- exit(1);
- }
- // パラメータを確認します ( -h)
- if (hosts.empty())
- {
- // 環境変数から値を取得してみます
- const char* hosts_ = getenv("HOSTS");
- if (NULL == hosts_)
- {
- fprintf(stderr, "パラメータ[-h]の値が設定されていません");
- exit(1);
- }
- hosts= hosts_ ;
- mooon::utils::CStringUtils::trim(hosts);
- if (hosts.empty())
- {
- fprintf (stderr, "parameter[-h] の値が設定されていません");
- exit(1);
- }
- }
- // パラメータを確認します (-u)
- if (user.empty())
- {
- fprintf(stderr, "パラメータ[-u]の値が設定されていません");
- exit(1);
- }
- // 检查パラメータ(-P)
- if (password.empty())
- {
- fprintf(stderr, "パラメータ[-P]の値が設定されていません");
- exit(1);
- }
- std::vector 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] errorn");
- exit(1);
- }
- std::string リモートファイルパス = ディレクトリ +標準::string("/") + mooon::utils::CStringUtils::extract_filename(source);
- std::vector results(num_remote_hosts_ip);
- for (int i=0; i
- {
- bool color = true;
- const std::string&remote_host_ip = hosts_ip[i];
- results[i].ip = remote_host_ip;
- results[i].success = false;
- 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
- {
- int file_size = 0;
- ムーン::net::CLibssh2 libssh2(remote_host_ip, ポート, ユーザー, パスワード, mooon::argument::t->value());
- libssh2.upload(source, リモートファイルパス, &file_size);
- fprintf(stdout, "["PRINT_COLOR_YELLOW"%s"PRINT_COLOR_NONE"] 成功: %d bytesn",remote_host_ip.c_str(), file_size);
- results[i].success = true;
- }
- catch (mooon::sys::CSyscallException& ex)
- {
- if (color)
- fprintf(stdout, PRINT_COLOR_NONE); // color = true;
- fprintf(stderr, "["PRINT_COLOR_RED"%s"PRINT_COLOR_NONE"] 失敗しました: %sn", 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"] 失敗しました: %sn", Remote_host_ip.c_str(), ex.str().c_str());
- }
- results[i].秒 = stop_watch.get_elapsed_microseconds() / 1000000;
- std::cout << std::endl;
- }
- // 出总结
- std::cout << std::endl;
- std::cout << "=================================" << std::endl;
- int num_success = 0; // 成功した数
- int num_failure = 0; // 失われた数
- for (std::vector::size_type i=0; i
- {
- const struct ResultInfo& result_info = results[i];
- std::cout <<結果情報 << std::endl;
- if (result_info.success)
- ++num_success;
- else
- ++num_failure;
- }
- std: :cout << "成功: " << num_success << "、失敗: " << num_failure << std::endl;
- return 0;
- }
http://www.bkjia.com/PHPjc/1117250.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/1117250.html技術記事上にあるファイルを多台机ツールに転送 使用例: ./mooon_upload -h=192.168.10.11,192.168.10.12 -p=6000 -u=root -P='root123' -s=./abc -d=/tmp/表示将本の地の文./abc 上传...