如何从ruby在远程主机上执行交互式shell程序
我试图从另一个ruby程序在远程主机上执行一个交互式shell程序。为了简单起见,假设我要执行的程序如下: 请给我一个号码: number=get.chomp 把你给我的{number} 迄今为止最成功的方法是使用我从中获得的方法。就是这个: 需要“open3” Open3.popen3ssh-ttroot@remote“ruby numbers.rb”do | stdin,stdout,stderr| stdin=输入流 stdout=输出流 stderr=stderr流 线程=[] 线程尝试以下操作:如何从ruby在远程主机上执行交互式shell程序,ruby,bash,shell,ssh,Ruby,Bash,Shell,Ssh,我试图从另一个ruby程序在远程主机上执行一个交互式shell程序。为了简单起见,假设我要执行的程序如下: 请给我一个号码: number=get.chomp 把你给我的{number} 迄今为止最成功的方法是使用我从中获得的方法。就是这个: 需要“open3” Open3.popen3ssh-ttroot@remote“ruby numbers.rb”do | stdin,stdout,stderr| stdin=输入流 stdout=输出流 stderr=stderr流 线程=[] 线程尝试
require "readline"
require 'open3'
Open3.popen3("ssh -tt root@remote 'ruby numbers.rb'") do |i, o, e, th|
Thread.new {
while !i.closed? do
input =Readline.readline("", true).strip
i.puts input
end
}
t_err = Thread.new {
while !e.eof? do
putc e.readchar
end
}
t_out = Thread.new {
while !o.eof? do
putc o.readchar
end
}
Process::waitpid(th.pid) rescue nil
# "rescue nil" is there in case process already ended.
t_err.join
t_out.join
end
我让它工作了,但别问我为什么工作。这主要是试错
备选方案:
使用Net::SSH,您需要使用:on_进程和一个线程:别忘了添加session.loop0.1。更多信息请点击链接。Thread/:on_进程的想法启发我写了一个供自己使用的gem:
如果Ruby程序中的最后一个调用是SSH,那么可以执行SSH-ttroot@remote“ruby numbers.rb”。但是,如果您仍然需要UserRubySh之间的交互,那么前面的替代方案是最好的。
试试这个:
require "readline"
require 'open3'
Open3.popen3("ssh -tt root@remote 'ruby numbers.rb'") do |i, o, e, th|
Thread.new {
while !i.closed? do
input =Readline.readline("", true).strip
i.puts input
end
}
t_err = Thread.new {
while !e.eof? do
putc e.readchar
end
}
t_out = Thread.new {
while !o.eof? do
putc o.readchar
end
}
Process::waitpid(th.pid) rescue nil
# "rescue nil" is there in case process already ended.
t_err.join
t_out.join
end
我让它工作了,但别问我为什么工作。这主要是试错
备选方案:
使用Net::SSH,您需要使用:on_进程和一个线程:别忘了添加session.loop0.1。更多信息请点击链接。Thread/:on_进程的想法启发我写了一个供自己使用的gem:
如果Ruby程序中的最后一个调用是SSH,那么可以执行SSH-ttroot@remote“ruby numbers.rb”。但是,如果您仍然需要UserRubySh之间的交互,那么前面的替代方案是最好的。
您是否尝试过使用Net::SSH?我已经看到了获取输出的on_data方法。问题是我不想执行命令并获取其输出。我想执行一个命令,显示其输出,从用户那里获取输入,显示更多输出,等等。我不知道如何使用net::ssh或其他工具来执行。Re:理想的解决方案是这样做,即用户不会意识到IO是在远程主机上完成的:stdin转到远程主机stdin,来自远程主机的stdout向我显示。实现这一点的方法是sshuser@remote程序没有本地的Ruby程序会妨碍透明度:您是否尝试过使用Net::SSH?我已经看到了获取输出的on_data方法。问题是我不想执行命令并获取其输出。我想执行一个命令,显示其输出,从用户那里获取输入,显示更多输出,等等。我不知道如何使用net::ssh或其他工具来执行。Re:理想的解决方案是这样做,即用户不会意识到IO是在远程主机上完成的:stdin转到远程主机stdin,来自远程主机的stdout向我显示。实现这一点的方法是sshuser@remote程序没有本地的Ruby程序会妨碍透明度:这是一段非常有用的代码。感谢您创建和共享此文件。这并没有达到与shell完全交互所需的程度。例如,某些命令可能需要vim打开并允许编辑文档,但这无法处理该问题。虽然如果Ruby能够处理它会很好,但我认为如果您需要那种级别的交互性,那么在bash中编写shell脚本会更安全。这是一段非常有用的代码。感谢您创建和共享此文件。这并没有达到与shell完全交互所需的程度。例如,某些命令可能需要vim打开并允许编辑文档,但这无法处理该问题。虽然如果Ruby能够处理它会很好,但我认为如果您需要这种级别的交互性,那么在bash中编写shell脚本会更安全。