Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ruby在远程主机上执行交互式shell程序_Ruby_Bash_Shell_Ssh - Fatal编程技术网

如何从ruby在远程主机上执行交互式shell程序

如何从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流 线程=[] 线程尝试

我试图从另一个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脚本会更安全。