6

ブラウザーから php スクリプトで git pull を実行しようとしていますが、「sh: ホスト git.assembla.com ポート 22 に接続: 許可が拒否されました」というメッセージが表示されます。

私のphpスクリプト

<?php
$output=array();
$returnVar=0;
chdir("/var/www/html");
exec('git pull git@git.assembla.com:andrewadel.git master 2>&1', $output , $returnVar);
// exec('pwd', $output , $returnVar);
echo "<pre>\n";
echo "return status: $returnVar\n\n";
print_r($output);
echo "</pre>\n";

スクリプトを「apache」として手動で実行すると、すべて問題ありません

bash-4.1$ whoami
apache
bash-4.1$ php gitsync.php
<pre>
return status: 0

Array
(
    [0] => From git.assembla.com:andrewadel
    [1] =>  * branch            master     -> FETCH_HEAD
    [2] => Already up-to-date.
)
</pre>

ブラウザから実行すると失敗します

http://103.7.164.33/gitsync.php?111

return status: 1

Array
(
    [0] => ssh: connect to host git.assembla.com port 22: Permission denied
    [1] => fatal: The remote end hung up unexpectedly
)

ありがとう

4

4 に答える 4

4

ここには多くの変数があります...しかし、私が取り組んでいたリモートCGIスクリプトで、まったく同じ動作に直面しました。

私の場合、問題は CentOS 上の SELinux に関連していました。

user@remoteserver:~$ getsebool -a | grep httpd

示した:

...
httpd_can_network_connect --> off
...

可能な修正をテストします (sudo または root として実行):

user@remoteserver:~$ setsebool httpd_can_network_connect=1
//...then initiate your serverside script remotely

恒久的な修正 (上記が効果的であることが証明されている場合):

user@remoteserver:~$ setsebool -P httpd_can_network_connect=1

-P オプションは、サブジェクト SELinux ブール値が、将来の再起動時にデフォルトとして指定された値に設定されるようにします。参照: man getseboolman setsebool

于 2012-09-19T06:40:24.070 に答える
1

Apacheは、「nobody」ユーザーとしてスクリプトを実行します。スクリプトは、秘密鍵が〜apache / .ssh/id_rsaに保存されている可能性が高いことに依存しています

失敗は、gitがそのキーにアクセスできず、gitサーバーに対して自身を認証できないことです。

解決策は、使用する正しいキーを指定し、スクリプトを実行しているユーザーがそのキーにアクセスできるようにすることです。

キーを指定する方法については、次をお読みください。

Rubyの有無にかかわらずシェルコマンドを実行するときに使用するプライベートSSHキーを指定しますか?

別のユーザーとして実行するためのアプローチについては、こちらをご覧ください。

https://serverfault.com/questions/226374/how-to-run-php-files-as-another-user-with-apache-and-fastcgi

誰も実行しない(それ以降、誰もユーザーが秘密鍵にアクセスできないため)、またはApacheとして実行することはお勧めしません(それ以降、サイトでエクスプロイトが見つかった場合に発生する可能性のあるダメージが増加します)。したがって、秘密鍵を読み取ってgitコマンドを実行するための最小限の権限を持つ別のユーザーを作成する必要があります。このための制限付きユーザーアカウントを作成し、キー(パブリック/プライベート)を〜/ .sshに配置するだけの場合は、キーを指定する必要がない場合があります。

于 2012-09-11T13:59:53.723 に答える
1

Web サーバーと PHP のインストールは、Suhosin、セーフモード、Apparmor、またはその他のセキュリティ メカニズムによって強制されていますか?

さらに操作を行う場合は、 php-gitなどの PHP-Git バインディングを試すことをお勧めします。このモジュールは、PHP コードで Git を操作するために設計されています。

于 2012-09-11T13:31:10.140 に答える
0

これは権限の問題ですか? PHP スクリプトは、ほとんどの場合、git コマンドを実行する権限を持たない nobody ユーザーとして実行されます。

于 2012-09-11T13:23:57.137 に答える