Class: Rbcli::RemoteExec
- Inherits:
-
Object
- Object
- Rbcli::RemoteExec
- Defined in:
- lib/rbcli/features/remote_exec.rb
Instance Method Summary collapse
-
#initialize(cmd, connection_string, remote_identity, params, args, global_opts, config) ⇒ RemoteExec
constructor
A new instance of RemoteExec.
- #run ⇒ Object
Constructor Details
#initialize(cmd, connection_string, remote_identity, params, args, global_opts, config) ⇒ RemoteExec
Returns a new instance of RemoteExec.
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/rbcli/features/remote_exec.rb', line 27 def initialize cmd, connection_string, remote_identity, params, args, global_opts, config @cmd = cmd @params = params.to_json.gsub("\"", "\\\"") @args = args.to_json.gsub("\"", "\\\"") @global_opts = global_opts.to_json.gsub("\"", "\\\"") @config = config.to_json.gsub("\"", "\\\"") @remote_host = parse_connection connection_string, remote_identity ## SCRIPT COMMANDS if !@cmd.script.nil? @execution_block = lambda do |ssh| # Set paths tmpdir = ssh.exec! 'mktemp -d /tmp/rbcli.XXXXXXXXXXXX' remote_script_path = "#{tmpdir.strip}/script.sh" local_rbclilib_path = "#{File.dirname(__FILE__)}/../../../lib-sh/lib-rbcli.sh" remote_rbclilib_path = "#{tmpdir.strip}/lib-rbcli.sh" # Upload scripts ssh.scp.upload @cmd.script.path, remote_script_path ssh.scp.upload local_rbclilib_path, remote_rbclilib_path ssh.exec! "chmod 0700 #{remote_script_path}" # We need to test for JQ -- if it is not present we ask the user for the sudo password jq_found = ssh.exec!('which jq').exitstatus == 0 if jq_found sudopw = nil else print "JQ not found on remote system. Please enter sudo password to install it, or leave blank if no password needed: " sudopw = gets.chomp end # Since we need to sudo, we need to send the sudo password when prompted #result = '' channel = ssh.open_channel do |channel, success| channel.on_data do |channel, data| print data.to_s if !jq_found and data =~ /^\[sudo\] password for / channel.send_data "#{sudopw}\n" # else # result += data.to_s end end channel.request_pty channel.exec "__RBCLI_PARAMS=\"#{@params}\" __RBCLI_ARGS=\"#{@args}\" __RBCLI_GLOBAL=\"#{@global_opts}\" __RBCLI_CONFIG=\"#{@config}\" source #{remote_script_path}" channel.wait end channel.wait #puts result # Cleanup ssh.exec! "rm -rf #{tmpdir}" end ## EXTERN COMMANDS elsif !@cmd.extern.nil? @execution_block = lambda do |ssh| channel = ssh.open_channel do |channel, success| channel.on_data do |channel, data| print data.to_s end channel.request_pty channel.exec "__RBCLI_PARAMS=\"#{@params}\" __RBCLI_ARGS=\"#{@args}\" __RBCLI_GLOBAL=\"#{@global_opts}\" __RBCLI_CONFIG=\"#{@config}\" __RBCLI_MYVARS=\"#{@myvars}\" #{@cmd.extern.path}" channel.wait end channel.wait end ## STANDARD COMMANDS else @execution_block = lambda do |ssh| raise Exception.new "Warning: Remote SSH Execution does not yetexist for Standard Ruby commands. Please use a Script or External command to use this feature." end end end |
Instance Method Details
#run ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/rbcli/features/remote_exec.rb', line 104 def run case @remote_host[:credstype] when :keyfile Net::SSH.start(@remote_host[:hostname], @remote_host[:username], port: @remote_host[:port], keys: @remote_host[:creds], keys_only: true, &@execution_block) when :keytext Net::SSH.start(@remote_host[:hostname], @remote_host[:username], port: @remote_host[:port], key_data: @remote_host[:creds], keys_only: true, &@execution_block) when :password Net::SSH.start(@remote_host[:hostname], @remote_host[:username], port: @remote_host[:port], password: @remote_host[:creds], keys_only: false, &@execution_block) else raise Exception.new "Invalid SSH Connection: No credentials specified for host #{@remote_host[:hostname]}" end end |