2

ユーザーがフォームを送信できる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には何も追加しませんでした。

4

1 に答える 1

0

コンソールから実行するときは、自分のアカウントを使用していますよね?

これはちょっと奇妙ですが、私の推測では、「/home/www-data/.ssh/my_ssh_username_id_rsa」への読み取りアクセス権を持たないアカウントで実稼働 Web アプリが実行されていると思います。

あなたの説明から、それはほとんど何らかの権限の問題である必要があります。

于 2012-05-17T03:12:40.170 に答える