Net :: SSH适用于生产rails控制台,AuthenticationFailed来自生产webapp

时间:2011-09-23 18:14:42

标签: ruby-on-rails ruby ruby-on-rails-3 delayed-job net-ssh

我有一个rails应用程序,用户可以在其中提交表单,然后通过ssh连接到远程服务器以调用脚本。最终我打算使用delayed_job或类似的东西,但即使是一个简单的测试我也无法让它在生产中工作。

奇怪的是,Net :: SSH在生产环境中从控制台运行得很好,但是当我在生产环境中提交表单时,它失败了。控制台和webapp都可以在开发中正常运行。

错误:

  

Net :: SSH :: AuthenticationFailed(my_ssh_username):

     

app / models / branch.rb:69:在`ssh_to_machine'

中      

app / controllers / branches_controller.rb:55:在`update'

Controller的更新操作:

  def update
    @branch = Branch.find(params[:id])
    if @branch.update_attributes(params[:branch])
      @branch.ssh_to_machine(@branch.hostname, @branch.user_name, @branch.command_to_run)
      redirect_to @branch, :notice  => "Update request now processing."
    else
      render :action => 'edit'
    end
  end

我正在调用的方法,主要是从Net :: SSH api示例中复制/粘贴:

def ssh_to_machine(host_name, user_name, command_to_run)
    require 'net/ssh'
    Net::SSH.start(host_name, user_name, { :verbose => Logger::DEBUG, :keys => %w{ /home/www-data/.ssh/my_ssh_username_id_rsa }, :auth_methods => %w{ publickey } }) do |ssh|
      # capture all stderr and stdout output from a remote process
      output = ssh.exec!("hostname")

      # run multiple processes in parallel to completion
      ssh.exec command_to_run
      ssh.loop
    end
end

我已经尝试过和不用了:verbose,:keys,:auth_methods;每次都要小心重启apache,但是在生产中它始终可以从控制台运行(在调用'rails c'之前RAILS_ENV =生成导出)并且从不在webapp上运行。

我还欢迎任何关于如何在从webapp调用它时获得增强日志记录的建议 - :verbose在控制台上为我工作但没有向我的production.log添加任何内容。

1 个答案:

答案 0 :(得分:0)

当您从控制台运行它时,您正在使用自己的帐户,对吧?

这有点奇怪,但我的猜测是您的生产网络应用程序在没有“/home/www-data/.ssh/my_ssh_username_id_rsa”读取权限的帐户下运行。

从您的描述中,它几乎必须是某种权限问题。