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.