У меня есть приложение rails, где пользователь может отправить форму, и она отключается и подключается к удаленному серверу через ssh для вызова скрипта. В конце концов я планирую использовать delayed_job или что-то в этом роде, но я не могу заставить его работать на производстве даже с помощью простого теста.
Странно то, что Net :: SSH прекрасно работает с консоли в работе, но завершается неудачно с AuthenticationFailed, когда я отправляю форму в работе. И консоль, и веб-приложение прекрасно работают в процессе разработки.
Ошибка:
Net :: SSH :: AuthenticationFailed (my_ssh_username):
app / models / branch.rb: 69: в `ssh_to_machine '
app / controllers / branch_controller.rb: 55: в `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
Метод, который я вызываю, в основном копируется / вставляется из примера API Net :: SSH:
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_ENV = производство экспортируется до вызова rails c) и никогда не работает из веб-приложения.
Я также приветствовал бы любые рекомендации о том, как получить улучшенную запись в журнал, когда я вызываю его из веб-приложения: подробный текст работал для меня в консоли, но ничего не добавлял в мой production.log