2011-11-14 68 views
12

很容易診斷我遇到過的最困難的問題。我似乎無法呼叫:通過PHP執行IIS git pull IIS

exec('call git pull', $output); 

該進程掛起並傾向於採取與它的IIS。

exec('call git status', $output); //works fine 

這裏是我做了什麼:

  • 生成的RSA密鑰添加到github上(密碼爲空)
  • 每個人都有mysite/.git/權限,Program Files/git/bincmd.exe
  • 試過SSL在其他帖子中用'斜線'問題提到的證書修補程序
  • 嘗試使用https://而不是SSH
  • 試圖管道到stderr 2>NUL2>&1

顯然,有一個權限問題,即exec電話cmd.exe進而調用git.exe,進而調用sh.exe連接到github上,這反過來又利用了git-pull和可能git-send-pack和上帝知道什麼。

我猜'sh.exe'確定當前用戶是IUSR並且找不到RSA密鑰進行身份驗證。

如果我能弄清楚如何ssh-keygen IUSR帳戶,我會嘗試。

如果我能弄清楚如何exec git bash而不是git(通過cmd.exe)我會試試這個。

這裏的問題在它的最簡單的形式:

如何從我的GitHub庫通過PHP的exec方法拉?

該問題當然似乎與SSH,但我完全在一切嘗試結束。

幫助!

+0

爲什麼使用'call git pull'而不是'git pull'? – gustavotkg

+0

調用只是一個'推薦'的方法使用exec()作爲一個閱讀它 - 我已經試過這兩種方法,並沒有發現可觀的區別 – rmirabelle

+0

我相當積極,你面臨寫權限問題。如果你考慮git status與git pull之間的區別..一個顯示關於存儲庫的信息,而另一個實際上使文件系統級別發生變化。 – Kevin

回答

12

我今天所面臨的同樣的問題,使用進程監視器,看看發生了什麼事情,發現因爲某些原因sh.exeC:\Windows\SysWOW64\config\systemprofile\.ssh尋找鑰匙。所以我將C:\Users\Administrator\.ssh中的所有內容都複製到該文件夾​​中,並且完美運行。

+1

贏家!我還必須提供明確的權限,這個目錄,但它實際上是工作。奇蹟實現了,一天保存,世界做了一個更好的地方,賞金賞 – rmirabelle

+0

儘管這並沒有回答我的問題,但它指出了我正確的方向,我認爲它值得獎勵;-) – derickito

+0

你是怎麼發現的? – Petah

0

您將不得不直接授予cmd.exe權限。根據Windows的版本和您的應用程序池設置方式,它可能是IIS_IUSR,IUSR和/或NETWORK SERVICE。將具有完全權限的用戶添加到cmd.exe。

我當然不建議這樣做,因爲它有直接的安全隱患。這就是說,我還沒有發現任何其他的方式使它在Windows中發生。

+0

已經給了一段時間的權限 - 仍然沒有愛 – rmirabelle

0

您需要使用proc_open,因此會看到最可能與權限相關的問題。

這裏有一個script I use

<?php 

//error_reporting(E_ALL); 
ignore_user_abort(true); 

function syscall ($cmd, $cwd) { 
    $descriptorspec = array(
     1 => array('pipe', 'w'), // stdout is a pipe that the child will write to 
    ); 
    $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd); 
    if (is_resource($resource)) { 
     $output = stream_get_contents($pipes[1]); 
     fclose($pipes[1]); 
     proc_close($resource); 
     return $output; 
    } 
} 

// GitHub will hit us with POST (http://help.github.com/post-receive-hooks/) 
if (!empty($_POST['payload'])) { 

    // pull from master 
    $result = syscall('git pull', '/var/www/example.com'); 

    // send us the output 
    mail('[email protected]', 'GitHub hook `git pull` result', $result); 

    // clear APC 
    if (apc_clear_cache('opcode') == false) { 
     mail('root', 'Unable to apc_clear_cache()', ''); 
    } 

} 

?> 
+0

也許本指南可以幫助:http://technotes.tumblr.com/post/33867325150/php-hook-script-that-c​​an-git-pull-apc-clear-緩存 – webjay

+0

奇蹟般地和可怕的,這個腳本失敗相同,我現有的代碼:-( – rmirabelle

1

有一些PHP的git庫/工具。 https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#git-php

親自我已用黑客GLIP(在PHP git的庫)http://fimml.at/#glip

我有其中i已經添加的存檔功能在github源叉。 基本上我動態地創建一個git命令,並使用php的passthru方法來調用它。也許看着我的代碼可能會給你一些見解。這裏的承諾 https://github.com/fontvirus/glip/commit/89127f7f9a4dc61697929f36684533406f348ffe

0

我能夠通過遵循這裏的大部分內容來部分解決這個問題。我跑了跑

ssh-agent -s
ssh-add -l

,看看我有什麼鍵批處理腳本。在運行這些命令之前,我使用正確的ssh密鑰將HOME=/c/Users/Username環境變量設置給我的用戶。 (我使用的UNIX路徑是因爲我使用Git的Bash運行它)

+0

我會去看看,謝謝 – rmirabelle

0

我不太肯定窗口的環境

,但存在的主要問題是「PHP文件」調用exec命令不擁有作爲管理員的權限(或者* NIX os中的root)

我的環境中我把那個文件作爲root權限(比如sudo的東西) 另一種方式是創建具有權限的新用戶組777並將該文件分配給擁有該用戶的組

希望這可以幫到

0

今天早些時候我有這個問題,並以不同的方式解決了它。

我的問題是,IUSR沒有一個主文件夾來放入ssh密鑰或git憑證文件。

我創建了一個叫混帳前更改了HOME變量sh文件,把我的鑰匙在正確的位置,就好像這是它的主文件夾,然後用sh.exe運行.SH

#!/bin/bash 
export HOME="/c/some/location" 
git pull 
1

我正在運行Windows Server 2012,無法讓Iamz的解決方案工作。

我在我的C:\中搜索了「.ssh」,並注意到在C:\Program Files (x86)\Git\.ssh處還有另一個.ssh文件夾。我將C:\Users\Administrator\.ssh中的所有內容複製到此文件夾中,設置權限以允許IUSR訪問,並且所有內容都是猶太教版本。

+0

不適合我,我可以做混帳狀態,但不是混帳拉 –

0

上Iamz的解決方案的另一個變體是使用目錄C:\Windows\System32\config\systemprofile\.ssh

我那個來到我的IIS服務器,當即表示C:\Windows\System32\config\systemprofile\.ssh失蹤上運行以下腳本(請設置$ path_of_git和$ path_to_repo適當爲您的機器):

<?php 
$descriptorspec = array(
    0 => array("pipe", "r"), // stdin 
    1 => array("pipe", "w"), // stdout 
    2 => array("pipe", "w"), // stderr 
); 
$path_of_git = 'c:\\path\\to\\git'; 
$path_to_repo = 'C:\\inetpub\\repo'; 
$process = proc_open($path_of_git.' fetch', $descriptorspec, $pipes, $path_to_repo, null); 
$stdout = stream_get_contents($pipes[1]); 
fclose($pipes[1]); 
echo '<pre>'.htmlspecialchars($stdout).'</pre>'; 
$stderr = stream_get_contents($pipes[2]); 
fclose($pipes[2]); 
echo '<pre style="color:red;">'.htmlspecialchars($stderr).'</pre>'; 
echo '<p>return value=' . proc_close($process) . '</p>'; 
?> 

之所以這麼說,我還是通過權限問題的困擾,所以我發現它有用,只是宣佈HOME是別的地方,IUSR可以得到輕鬆的每個混帳前命令,並執行整個過程用git sh。例如:

\pathToGit\bin\sh -c "export HOME='/c/somewhereIUSRCanGetTo/';git fetch"

C:\somewhereIUSRCanGetTo\.ssh\包含私鑰和allowed_hosts文件

0

移動你的.ssh文件夾USERPROFILE目錄。你可以在這個全局變量$ _SERVER ['USERPROFILE']中看到你的應用程序配置文件目錄。 在我的情況下,它是C:\ Windows \ system32 \ config \ systemprofile。 然後授予用戶讀取/寫入此文件夾(.ssh)的權限:IIS_IUSRS,IUSR