1

PHPスクリプトから実行するGitプルコマンドを実行する必要があるときに、操作に固執しました。(ユーザーは www-data グループに追加されます) パスフレーズを入力しません。これはコマンドを使用して解決できることがわかりました:

eval "$(ssh-agent)"

ssh-add 

ただし、このコマンドは自分のユーザー (george など) の下でのみ機能します。しかし、git cloned repository の www-data の下で次のコマンドを実行しようとすると:

sudo -u george git pull

私は常に次のメッセージを取得します

Enter passphrase for key '/home/george/.ssh/id_rsa': 

注: ユーザーを www-data グループと visudo ユーザーにも追加します。しかし、パスワードの受け渡しを解決する方法やパスフレーズの入力を回避する方法がわかりません。

助けてくれてありがとう。

4

1 に答える 1

3

目的を達成するには、いくつかの方法があります。

  1. 私の目には、最も「正しい」方法は次のとおりです。

    1. ユーザー用に特別な SSH キーを生成し、www-dataこのキーがパスワードで暗号化されていないことを確認します。これは、認証に使用されるキーを復号化するために SSH クライアントによって要求されるのがこのパスフレーズであるためです。
    2. そのキーをリモートでデプロイして (セットアップに大きく依存します)、読み取りアクセスに使用できるようにします。
    3. 次に、このキーをそのユーザーのみが読み取れるようにする必要がありwww-dataます(!)。つまり、キー ファイルは所有者であり、アクセス許可ビットが設定されてwww-dataいる0600( ) 必要があります。-rw-------

      これを実現するには、いくつかの方法があります。

      • ~/.sshSSH クライアントはディレクトリ (つまり.ssh、ユーザーのホーム ディレクトリの下のディレクトリ )の下でキー ファイルを探すため、いくつかのオプションがあります。
        • www-dataユーザーがファイル システムに実際のホーム ディレクトリを持っている場合 ( を実行することで確認できます)、そこにディレクトリをgetent passwd www-data作成し、そこにキーを配置できます。.ssh
        • プル スクリプトで、HOME環境変数 (およびexportその新しい値) を実行前にオーバーライドしgitて、SSH クライアントがホーム ディレクトリを別の場所に解決できるようにします。残りは上記のように設定する必要があります。
      • SSH クライアントはユーザーごとの構成をサポートしており、キーを検索する場所を指定したり、サーバーごとに異なるキーを指定したりすることもできます。ssh_config(5)マニュアルページを参照してください。
      • SSH クライアントは通常、コマンド ラインでのキー ファイルの場所の指定をサポートしています。OpenSSH通常、一般的な Linux ベースおよび BSD ベースの OS で使用されるクライアント バイナリは、コマンド ライン オプション (「identity」の略) をサポートします-i。したがって、別の方法は、呼び出しssh -i /path/to/the/key/fileてそのスクリプトへのパスを ( exported) 環境変数に入れるだけのラッパー スクリプトを作成し、 GIT_SSHGit がssh.
  2. 使用するsudoことも別のオプションですが (私は嫌いですが)、変更された資格情報で実行される新しいプロセスは、セッションに存在する特定の環境変数を継承しない可能性がssh-agentあります。これは、復号化されたキーがキャッシュされている実行中のインスタンスに接続する方法を SSH クライアントに指示します (はい)。 、このエージェントの存在により、対話型ログイン セッションでパスフレーズを 1 回入力するだけで済みます)。

    ssh-agentそのため、資格情報を変更して Git バイナリを実行するときに、どのように機能し、sudoそれに関連する環境変数を保持する方法について読むことができます。

    Unix ドメイン ソケット (または fifo ? — 現時点では思い出すことはできません) にssh-agent接続するために実行中のインスタンスによって提供されるアクセス許可の問題がまだある可能性があるため、それが機能するかどうかは正確にはわかりません。いくつかの調査を行う必要があります。

  3. 次のようなプログラムを使用してsshpass、パスワードを SSH クライアントにフィードします。

    これは、直接、または SSH クライアント自体をラップすることによって行うことができます (上記を参照)。

    このアプローチは、パスワードがスクリプトのどこかにクリアテキストで保存されることを意味するため、悪臭を放つことに注意してください。したがって、最初のケースで暗号化されていないキーが保護されるのと同じ方法で、このスクリプトが保護されていることを確認する必要があります。

さらに別のオプションは、読み取り専用の認証されていないプロトコル (git://またはfile://スキーマ — 適用可能な方) を使用してリポジトリへのアクセスを提供することです。リポジトリにはさまざまな方法でアクセスでき、同じ名前のリモートのフェッチとプッシュに異なる URL (異なるスキーマ、つまりプロトコルを使用) を使用することもできます。

于 2013-05-24T12:38:19.063 に答える