inputioremote-debuggingremote-serversshkit

How to ask for a user input from a remote server with SSHKit?


I need to ask a user input from a ruby script on a remote server. I managed to perform it with bash with the following code

class ConfirmHandler
  def on_data(command, stream_name, data, channel)
    puts "data received: #{data}"
    if data.to_s =~ /\?$/
      prompt = Net::SSH::Prompt.default.start(type: 'confirm')
      response = prompt.ask "Please enter your response (y/n)"
      channel.send_data "#{response}\n"
    end
  end
end

require 'sshkit'
require 'sshkit/dsl'
include SSHKit::DSL

on '<ssh-server-name>' do |host|
  cmd = <<-CMD
    echo 'Do something?';
    read response;
    echo response=$response
  CMD

  capture(cmd.squish , interaction_handler: ConfirmHandler.new)
end

When I run this script on my local machine I see

data received: Do something?
Please enter your response (y/n)
data received: response=y

I try to wrap the bash CMD code into a ruby script:

on '<ssh-server-name>' do |host|
  cmd = <<-CMD
    ruby -e "
      puts 'Do something?';
      require 'open3';
      response = Open3.capture3('read response; echo $response');
      puts 'response=' + response.to_s;
    "
  CMD

  capture(cmd.squish , interaction_handler: ConfirmHandler.new)
end

and get the following result:

data received: Do something?
Please enter your response (y/n)
data received: response=["\n", "", #<Process::Status: pid 9081 exit 0>]

I was writing the code above looking at the Interactive commands section on the SSHKit Github home page

How can I capture the user response from a ruby script with SSKKit on the remote server?


Solution

  • I was able to capture the user response from a ruby script on a remote server with the following code:

    # ask_response.rb
    
    puts 'Do something?';
    response = `read response; echo $response`;
    puts 'response=' + response.to_s;
    

    ask_response.rb is a ruby script which is located on a remote server. And locally I run:

    on '<ssh-server-name>' do |host|
      capture("ruby ask_response.rb" , interaction_handler: ConfirmHandler.new)
    end