別のルビープログラムからリモートホスト上で対話型シェルプログラムを実行しようとしています。単純化のための私が実行したいプログラムは、このようなものであると仮定してみましょう:rubyからリモートホスト上で対話型シェルプログラムを実行する方法
puts "Give me a number:"
number = gets.chomp()
puts "You gave me #{number}"
これまでのところ、私はhereからもらったものを使用しているされてきた最も成功したアプローチ。それは、この1:
require 'open3'
Open3.popen3("ssh -tt [email protected] 'ruby numbers.rb'") do |stdin, stdout, stderr|
# stdin = input stream
# stdout = output stream
# stderr = stderr stream
threads = []
threads << Thread.new(stderr) do |terr|
while (line = terr.gets)
puts "stderr: #{line}"
end
end
threads << Thread.new(stdout) do |terr|
while (line = terr.gets)
puts "stdout: #{line}"
end
end
sleep(2)
puts "Give me an answer: "
answer = gets.chomp()
stdin.puts answer
threads.each{|t| t.join()} #in order to cleanup when you're done.
end
問題は、これは私には十分な「インタラクティブ」ではない、と私は実行したいプログラム(ない簡単なnumbers.rb)は、入力のより多くを持っているということです/出力。 apt-get install
と考えると、いくつかの問題を解決するための入力が必要です。
私はnet :: sshとptyについて読んだことがありますが、私が探している(簡単な/エレガントな)解決策になるかどうかは分かりませんでした。
理想的な解決策は、ユーザがリモートホスト上でIOが実行されていることを認識しないようにすることです。標準入力はリモートホストstdinに行き、リモートホストからのstdoutは私と私はそれを示します。
あなたは私が試してみることができるアイデアがあれば、私はそれらを聞いて幸せになります。ありがとうございました!
Net :: SSHを試しましたか? – tadman
出力を得るためにon_dataメソッドを見ました。問題は、コマンドを実行してその出力を取得したくないということです。私はコマンドを実行し、その出力を表示し、ユーザーからの入力を取得し、より多くの出力を表示したいと思います。 net :: ssh(または他のもの)でそれを行う方法はわかりません。 – dcere
Re:*理想的な解決方法は、ユーザーがリモートホスト上でIOが実行されていることを認識しないようにすることです。標準入力はリモートホストstdinに行き、リモートホストからのstdoutは私と私はそれを示します。*これを達成する方法は 'ssh user @ remote program'です。透明性のためにローカルのRubyプログラムはありません。 :) – Kaz