【问题标题】:Net::SSH works from production rails console, AuthenticationFailed from production webappNet::SSH 从生产 Rails 控制台工作,AuthenticationFailed 从生产 webapp
【发布时间】:2011-09-23 18:14:42
【问题描述】:

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

奇怪的是,Net::SSH 在生产环境中的控制台上工作得很好,但是当我在生产环境中提交表单时它会因 AuthenticationFailed 而失败。控制台和 webapp 在开发中都可以正常工作。

错误:

Net::SSH::AuthenticationFailed (my_ssh_username):

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

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

控制器的更新动作:

  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 = production)并且从不从webapp工作。

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

【问题讨论】:

  • 使用rails c production启动控制台是否有效?
  • 是的,谢谢@rdvdijk,我刚刚试过rails c production,它工作正常。
  • 澄清一下,“rails c production”和 SSH 在生产控制台上运行良好,但在生产 webapp 上仍然失败。
  • 会不会是服务器的防火墙问题?
  • 不确定哪个服务器会出现防火墙问题 - 运行 rails 应用程序的 apache 服务器还是我正在连接的服务器?连接在同一台机器之间(apache - > ssh),唯一一次它不起作用是从作为网页运行的rails应用程序(但在从控制台运行rails应用程序时工作)我不明白防火墙是如何关联的。

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


【解决方案1】:

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

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

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

【讨论】:

  • 当我从控制台运行时,我实际上使用的是 www-data 帐户。我仔细检查了权限,/home/www-data/.ssh/my_ssh_username_id_rsa 是 -rw------- 1 www-data www-data。这似乎也证实了如果我在控制台上运行时不是 www-data 的人,我会遇到相反的问题(不在控制台上工作,而是在生产中工作)。我认为这只是 Rails 中一种奇怪的“无 shell 访问”权限/安全性,没有人知道,因为没有人足够愚蠢(像我一样)尝试在其 rails 应用程序的后端直接运行 unix shell 命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2011-04-24
  • 2015-05-05
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多