2 Stimmen

Net::SSH funktioniert von der Produktions-Rails-Konsole, AuthenticationFailed von der Produktions-Webapp

Ich habe eine Rails-App, wo ein Benutzer ein Formular einreichen kann und es geht aus und verbindet sich mit einem Remote-Server über SSH, um ein Skript aufzurufen. Schließlich plane ich, delayed_job oder etwas ähnliches zu verwenden, aber ich kann es nicht bekommen, in der Produktion mit sogar einem einfachen Test zu arbeiten.

Das Seltsame ist, Net::SSH funktioniert ganz gut von der Konsole in der Produktion, aber es schlägt mit AuthenticationFailed, wenn ich das Formular in der Produktion senden. Sowohl die Konsole und die Webapp funktionieren gut in der Entwicklung.

Der Fehler:

Net::SSH::AuthenticationFailed (my_ssh_username):

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

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

Die Aktualisierungsaktion des Controllers:

  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

Die Methode, die ich aufrufe, wurde größtenteils aus dem Net::SSH api-Beispiel kopiert und eingefügt:

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

Ich habe es mit und ohne :verbose, :keys, :auth_methods ausprobiert; wobei ich darauf geachtet habe, Apache jedes Mal neu zu starten, aber in der Produktion funktioniert es immer von der Konsole aus (mit RAILS_ENV=production, das vor dem Aufruf von 'rails c' exportiert wird) und nie von der Webapp aus.

Ich würde mich auch über Empfehlungen freuen, wie ich eine verbesserte Protokollierung erhalte, wenn ich sie von der Webapp aus aufrufe - :verbose funktionierte bei mir auf der Konsole, fügte aber nichts zu meinem production.log hinzu.

0voto

David Punkte 1113

Wenn Sie es über die Konsole ausführen, verwenden Sie Ihr eigenes Konto, richtig?

Das ist etwas bizarr, aber ich vermute, dass Ihre Produktions-Webanwendung unter einem Konto ausgeführt wird, das keinen Lesezugriff auf "/home/www-data/.ssh/my_ssh_username_id_rsa" hat.

Nach Ihrer Beschreibung muss es sich fast um eine Art Berechtigungsproblem handeln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X