ユーザーがフォームを送信できるRailsアプリがあり、フォームがオフになり、ssh経由でリモートサーバーに接続してスクリプトを呼び出します。最終的にはdelayed_jobなどを使用する予定ですが、簡単なテストでも本番環境で動作させることはできません。
奇妙なことに、Net :: SSHは本番環境のコンソールからは問題なく機能しますが、本番環境でフォームを送信するとAuthenticationFailedで失敗します。開発では、コンソールとWebアプリの両方が正常に機能します。
エラー:
Net :: SSH :: AuthenticationFailed(my_ssh_username):
app / models / branch.rb:69:in `ssh_to_machine '
app / controllers / branchs_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_ENV=本番環境は「railsc」を呼び出す前にエクスポートされます)、Webアプリからは機能しません。
また、webappから呼び出したときに拡張ログを取得する方法に関する推奨事項も歓迎します-:verboseはコンソールで機能しましたが、production.logには何も追加しませんでした。