Net :: SSH funciona desde la consola de Rails de producción, Autenticación Fallida desde la aplicación web de producción

Tengo una aplicación de Rails donde un usuario puede enviar un formulario y se apaga y se conecta a un servidor remoto a través de ssh para llamar a un script. Eventualmente planeo usar delayed_job o algo así, pero no puedo hacer que funcione en producción con una simple prueba.

Lo extraño es que Net :: SSH funciona bien desde la consola en producción, pero falla con AuthenticationFailed cuando envío el formulario en producción. Tanto la consola como la aplicación web funcionan bien en el desarrollo.

El error:

Net :: SSH :: AuthenticationFailed (my_ssh_username):

app / models / branch.rb: 69: en `ssh_to_machine ‘

app / controllers / branches_controller.rb: 55: en `actualizar ‘

Acción de actualización del controlador:

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 

Método al que estoy llamando, en su mayoría copia / pegado desde el ejemplo de la API NetHHH:

 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 

Lo he intentado con y sin: verbose,: keys,: auth_methods; teniendo cuidado de reiniciar Apache cada vez, pero en producción siempre funciona desde la consola (con RAILS_ENV = producción exportada antes de llamar ‘rails c’) y nunca funciona desde la aplicación web.

También agradecería cualquier recomendación sobre cómo obtener un registro mejorado cuando lo llame desde la aplicación web: verbose funcionó para mí en la consola pero no agregó nada a mi archivo de producción.

Cuando lo ejecutas desde la consola, estás usando tu propia cuenta, ¿verdad?

Esto es un poco extraño, pero supongo que su aplicación web de producción se está ejecutando en una cuenta que no tiene acceso de lectura a “/home/www-data/.ssh/my_ssh_username_id_rsa”.

Desde su descripción, casi tiene que ser un tema de permisos de algún tipo.