diff --git a/src/server_env_manager.cpp b/src/server_env_manager.cpp index 6c27dc6..a7c8363 100644 --- a/src/server_env_manager.cpp +++ b/src/server_env_manager.cpp @@ -60,14 +60,14 @@ std::string server_env_manager::get_variable(const std::string& name) const { } // Helper method implementations -std::string server_env_manager::construct_ssh_cmd() const { +std::string server_env_manager::construct_ssh_cmd(bool allocateTTY) const { std::stringstream ssh_cmd; - ssh_cmd << "ssh -p " << get_SSH_PORT() << " " + ssh_cmd << "ssh -p " << get_SSH_PORT() << " " << (allocateTTY ? "-tt " : "") << get_SSH_USER() << "@" << get_SSH_HOST(); return ssh_cmd.str(); } -std::string server_env_manager::construct_standard_command_run_cmd(const std::string &service_name, const std::string &command, std::vector args, bool silent) const +sCommand server_env_manager::construct_standard_command_run_cmd(const std::string &service_name, const std::string &command, std::vector args, bool silent) const { std::string remote_service_template_path = remotepath::service_template(mServerName,service_name); std::string remote_service_config_path = remotepath::service_config(mServerName,service_name); @@ -83,8 +83,7 @@ std::string server_env_manager::construct_standard_command_run_cmd(const std::st } sCommand scommand(remote_service_template_path, "bash " + quote(script_path) + argstr + (silent ? " > /dev/null 2>&1" : ""), env_vars); - std::string run_cmd = scommand.construct_safecmd(); - return run_cmd; + return scommand; } @@ -119,27 +118,29 @@ bool server_env_manager::check_remote_items_exist(const std::vector return true; } -bool server_env_manager::execute_ssh_command(const sCommand& command) const { - std::string full_cmd = construct_ssh_cmd() + " " + quote(command.construct_safecmd()); - return execute_local_command(full_cmd); +bool server_env_manager::execute_ssh_command(const sCommand& command, bool allocateTTY) const { + std::string full_cmd = construct_ssh_cmd(allocateTTY) + " " + (allocateTTY ? halfquote(command.construct_rawcmd()) : quote(command.construct_safecmd())); + return (system(full_cmd.c_str()) == 0); } -bool server_env_manager::execute_ssh_command_and_capture_output(const sCommand& command, std::string &output) const +bool server_env_manager::execute_ssh_command_and_capture_output(const sCommand& command, std::string &output, bool allocateTTY) const { - std::string full_cmd = construct_ssh_cmd() + " " + quote(command.construct_safecmd()); + std::string full_cmd = construct_ssh_cmd(allocateTTY) + " " + quote(command.construct_safecmd()); return execute_local_command_and_capture_output(full_cmd, output); } bool server_env_manager::run_remote_template_command(const std::string &service_name, const std::string &command, std::vector args, bool silent) const { - std::string full_cmd = construct_standard_command_run_cmd(service_name, command, args, silent); - return execute_ssh_command(full_cmd); + sCommand scommand = construct_standard_command_run_cmd(service_name, command, args, silent); + bool allocateTTY = (command=="ssh"); + return execute_ssh_command(scommand, allocateTTY); } bool server_env_manager::run_remote_template_command_and_capture_output(const std::string &service_name, const std::string &command, std::vector args, std::string &output, bool silent) const { - std::string full_cmd = construct_standard_command_run_cmd(service_name, command, args, silent); - return execute_ssh_command_and_capture_output(full_cmd, output); + sCommand scommand = construct_standard_command_run_cmd(service_name, command, args, silent); + bool allocateTTY = (command=="ssh"); + return execute_ssh_command_and_capture_output(scommand, output, allocateTTY); } bool server_env_manager::execute_local_command(const sCommand& command) { @@ -180,6 +181,17 @@ std::string sCommand::construct_safecmd() const return commandstr; } +std::string sCommand::construct_rawcmd() const +{ + std::string rawcmd = "cd " + quote(mDir) + " && "; + + for (const auto& env_var : mVars) { + rawcmd += env_var.first + "=" + quote(dequote(trim(env_var.second))) + " "; + } + rawcmd += mCmd; + return rawcmd; +} + // base64 <<< "FOO=BAR WHEE=YAY bash ./test.sh" // echo YmFzaCAtYyAnRk9PPUJBUiBXSEVFPVlBWSBiYXNoIC4vdGVzdC5zaCcK | base64 -d | bash diff --git a/src/server_env_manager.hpp b/src/server_env_manager.hpp index 054fce5..ea3abf2 100644 --- a/src/server_env_manager.hpp +++ b/src/server_env_manager.hpp @@ -27,6 +27,7 @@ class sCommand { void add_env_var(const std::string& key, const std::string& value) { mVars[key] = value; } std::string construct_safecmd() const; + std::string construct_rawcmd() const; private: std::string mDir; @@ -66,15 +67,15 @@ class server_env_manager { bool run_remote_template_command_and_capture_output(const std::string& service_name, const std::string& command, std::vector args, std::string & output, bool silent=false) const; public: - bool execute_ssh_command(const sCommand& command) const; - bool execute_ssh_command_and_capture_output(const sCommand& command, std::string & output) const; + bool execute_ssh_command(const sCommand& command, bool allocateTTY=false) const; + bool execute_ssh_command_and_capture_output(const sCommand& command, std::string & output, bool allocateTTY=false) const; static bool execute_local_command(const sCommand& command); static bool execute_local_command_and_capture_output(const sCommand& command, std::string & output); private: - std::string construct_ssh_cmd() const; - std::string construct_standard_command_run_cmd(const std::string& service_name, const std::string& command, std::vector args, bool silent) const; + std::string construct_ssh_cmd(bool allocateTTY=false) const; + sCommand construct_standard_command_run_cmd(const std::string& service_name, const std::string& command, std::vector args, bool silent) const; private: std::string mServerName; diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index 56a95e5..b29f968 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -72,6 +72,11 @@ std::string quote(std::string str) return "\""+str+"\""; } +std::string halfquote(std::string str) +{ + return "'" + str + "'"; +} + std::string multi2string(std::vector values) { std::string result; diff --git a/src/utils/utils.hpp b/src/utils/utils.hpp index ad8ba52..aa46886 100644 --- a/src/utils/utils.hpp +++ b/src/utils/utils.hpp @@ -19,6 +19,7 @@ bool replace_line_in_file(const std::string& file_path, const std::string& searc std::string trim(std::string str); std::string dequote(std::string str); std::string quote(std::string str); +std::string halfquote(std::string str); std::string multi2string(std::vector values); std::vector string2multi(std::string values); std::vector split(const std::string& str, const std::string& delimiter); diff --git a/temp.sh b/temp.sh new file mode 100644 index 0000000..d6cb0e6 --- /dev/null +++ b/temp.sh @@ -0,0 +1,8 @@ +echo Y2QgIi9ob21lL2thdGllLy5kcm9wc2hlbGwvc2VydmljZXMvc3F1YXNoa2l3aS10ZXN0L3RlbXBsYXRlIiAmJiBlY2hvIFEwOU9Sa2xIWDFCQlZFZzlJaTlvYjIxbEwydGhkR2xsTHk1a2NtOXdjMmhsYkd3dmMyVnlkbWxqWlhNdmMzRjFZWE5vYTJsM2FTMTBaWE4wTDJOdmJtWnBaeUlnUTA5T1ZFRkpUa1ZTWDA1QlRVVTlJbk54ZFdGemFHdHBkMmtpSUVOUFRsUkJTVTVGVWw5UVQxSlVQU0k0TVRneElpQklUMU5VWDFCUFVsUTlJall3T0RBaUlFbE5RVWRGWDFKRlIwbFRWRkpaUFNKbmFYUmxZUzVxWkdVdWJub2lJRWxOUVVkRlgxSkZVRTg5SW5OeGRXRnphR3RwZDJrdmMzRjFZWE5vYTJsM2FTSWdTVTFCUjBWZlZFRkhQU0pzWVhSbGMzUWlJRXhQUTBGTVgwUkJWRUZmUms5TVJFVlNQU0lrZTBoUFRVVjlMeTV6YXkxMFpYTjBJaUJUUlZKV1JWSTlJbXRoZEdsbElpQlRSVkpXU1VORlBTSnpjWFZoYzJocmFYZHBMWFJsYzNRaUlGUkZUVkJNUVZSRlBTSnpjWFZoYzJocmFYZHBJaUJpWVhOb0lDSXZhRzl0WlM5cllYUnBaUzh1WkhKdmNITm9aV3hzTDNObGNuWnBZMlZ6TDNOeGRXRnphR3RwZDJrdGRHVnpkQzkwWlcxd2JHRjBaUzl6YzJndWMyZ2kgfCBiYXNlNjQgLWQgfCBiYXNo | base64 -d + +echo - +echo - +echo - + +echo Q09ORklHX1BBVEg9Ii9ob21lL2thdGllLy5kcm9wc2hlbGwvc2VydmljZXMvc3F1YXNoa2l3aS10ZXN0L2NvbmZpZyIgQ09OVEFJTkVSX05BTUU9InNxdWFzaGtpd2kiIENPTlRBSU5FUl9QT1JUPSI4MTgxIiBIT1NUX1BPUlQ9IjYwODAiIElNQUdFX1JFR0lTVFJZPSJnaXRlYS5qZGUubnoiIElNQUdFX1JFUE89InNxdWFzaGtpd2kvc3F1YXNoa2l3aSIgSU1BR0VfVEFHPSJsYXRlc3QiIExPQ0FMX0RBVEFfRk9MREVSPSIke0hPTUV9Ly5zay10ZXN0IiBTRVJWRVI9ImthdGllIiBTRVJWSUNFPSJzcXVhc2hraXdpLXRlc3QiIFRFTVBMQVRFPSJzcXVhc2hraXdpIiBiYXNoICIvaG9tZS9rYXRpZS8uZHJvcHNoZWxsL3NlcnZpY2VzL3NxdWFzaGtpd2ktdGVzdC90ZW1wbGF0ZS9zc2guc2gi | base64 -d +