Ruby net / ssh脚本没有关闭

时间:2014-08-29 21:21:55

标签: ruby net-ssh

我有一个ruby脚本,我使用net / ssh ssh到服务器,sudo -s,su - user,运行脚本并回答问题到该脚本。到目前为止,我能够做所有事情,登录,执行所有su / sudo的东西,运行脚本并回答问题,但我创建的频道不会关闭并结束脚本,似乎。它全部运行但在脚本运行后挂起。我究竟做错了什么?我是红宝石的菜鸟,所以我不完全确定发生了什么。谢谢你的帮助!

以下是我的内容:

Net::SSH.start("server01", 'user') do |ssh|
  ssh.open_channel do |channel|
    channel.on_request "exit-status" do |channel, data|
      $exit_status = data.read_long
    end

    channel.on_data do |channel, data|
      data
    end

    channel.request_pty do |channel, data|
      channel.send_data("sudo -s\n")
      channel.send_data("su - user2\n")
      sleep 0.5

      channel.send_data("/opt/scripts/test\n")
      sleep 10

      channel.send_data("answer1\n")
      sleep 5

      channel.send_data("answer2\n")
      sleep 5

      channel.send_data("answer3\n")
      sleep 10
    end

    channel.wait
    puts "SUCCESS" if $exit_status == 0
  end
end

1 个答案:

答案 0 :(得分:0)

实际上在测试中你需要发送exit\n否则你会挂起。

所以尝试在睡觉后添加它(你真的需要睡眠10吗?)

 channel.send_data("answer3\n")
 sleep 10
 channel..send_data("exit\n")

同样sudo -u user2 -H /opt/scripts/test将使你只需要退出一个shell。因为你的脚本开始3炮弹。 1当你登录并请求一个PTY时,一个运行root shell(sudo -s),然后另一个运行到user2。

所以块看起来像这样。

channel.request_pty do |channel, data|
  channel.send_data("sudo -u user2 -H /opt/scripts/test")
  sleep 10

  channel.send_data("answer1\n")
  sleep 5

  channel.send_data("answer2\n")
  sleep 5

  channel.send_data("answer3\n")
  sleep 10
  channel.send_data("exit\n")

end