2015-11-02 79 views
2

我目前正在爲我的git網頁界面工作。通過child_process.spawn訪問git本身。一切都很好,但有簡單的「命令 - >響應」機制,但我不明白我該怎麼處理命令提示符(例如git fetch要求輸入密碼)。假設有一些事件被解僱,但我不知道該聽什麼。我看到的只有命令行中的「[email protected]'s password: _」,其中node.js進程本身正在運行。NodeJS。 Child_process.spawn。處理過程'輸入提示

將這個請求重定向到我的web應用程序會很好,但它甚至有可能嗎?

我試圖監聽messagedatapipeendclosereadable在所有流(標準輸出,標準輸入,標準錯誤),但在密碼提示沒有一個火災。

這是我工作的解決方案(沒有提到的實驗):

var out=""; 
var err=""; 

var proc=spawn(exe,cmd); 
proc.on("exit",function(exitCode){ 

}); 
proc.stdout.on("data",function(data){ 
    out+=data; 
}); 
proc.stderr.on("data",function(data){ 
    err+=data; 
}); 
proc.on("close",function(code){ 
    if(!code)func(out); 
    else return errHandler(err); 
}); 

能否請您與我的調查,幫助我嗎?

UPDATE

現狀:我的GIT Web界面上有一個按鈕 「Fetch」(作爲一個例子,對於簡單的 「混帳提取」)。當我按下它時,會生成http請求並將其發送到由http.createServer(callback).listen(8080)創建的node.js服務器。 callback函數收到我的請求並創建child_process.spawn('git',['-C','path/to/local/repo','fetch'])。所有這一次,我只看到我的Web界面加載屏幕,但如果我切換到節點腳本正在運行的命令行窗口,我會看到一個密碼提示。現在讓我們假裝我無法將窗口切換到控制檯,因爲我工作在遠程。

我想在我的Web界面上看到密碼提示。例如,如果child_process在提示用戶輸入時會在child.stdin(或其他地方)發出某個事件,那麼實現起來會非常容易。在這種情況下,我會發送字符串「來吧,夥計,git想知道你的密碼!在這裏輸入:_______」回到web客戶端(通過response.end(str)),並將繼續等待下一個http連接與客戶端響應,包含所需的密碼。然後簡單地child.stdin.write(pass)它來攪拌過程。

此解決方案可能嗎?或者不涉及父進程的命令行。

UPDATE2

只是試圖聽衆附加到正式文檔中描述所有可能的事件:stdout和stderr(可讀,數據,結束,關閉,錯誤),標準輸入(漏極,光潔度,管,unpipe,錯誤),子(消息,退出,關閉,斷開連接,消息)。

在process.stdout,process.stderr上試着對git流進行管道處理後,嘗試了相同的監聽器。

密碼請求沒有火災......

回答

0

的最主要的原因,你的代碼無法正常工作,是因爲你只能找到與你的Git的過程中所發生的事情後,就是執行。

使用spawn的主要原因是因爲可以配置派生進程,並且stdout和stderr是父進程中的可讀流。

我剛剛試過這段代碼,它工作得很好。這是一個產生執行git push的進程的例子。但是,正如你可能知道git會詢問你的用戶名和密碼。

var spawn = require('child_process').spawn; 

var git = spawn('git', ['push', 'origin', 'master']); 

git.stderr.on('data', function(data) { 
    // do something with it 
}); 

git.stderr.pipe(process.stderr); 
git.stdout.pipe(process.stdout); 
  1. 撥打本地混帳回購協議和設置的東西,這樣就可以做到以上push命令。但是,你真的可以做任何git命令。
  2. 將其複製到名爲git_process.js的文件中。
  3. 與節點運行git_process.js
+0

嗯,也許我多一點「新手」,然後我想,但我真的不知道我需要什麼來適用於我的代碼。直接複製粘貼(使用我的變量名稱)會導致外部模塊出現異常。將密碼傳遞給屬性(如果我沒有正確的)不是一種選擇,因爲並不是所有的存儲庫都需要它。外部模塊也不是我的選擇,因爲我想讓「內部流程」更加清晰,而不是像某種魔法那樣思考。 – MadBrozzeR

+0

而且我不確定是否要將一個流直接流入另一個流。在我的情況下,我有兩個對象:'http.Server'和'ChildProccess'。第一個流'http.IncomingMessage'(可讀)和'http.ServerResponse'(可寫)。 ChildProccess有'stdout','stdin','stderr'。我想我需要保持'ChildProcess'進程的活動狀態,同時將請求重定向到http.Server,並始終關閉連接,並等待它再次打開,以便客戶端響應。所以我看不出直接管道。 (P.S.對不起,如果我的英語真的很差) – MadBrozzeR

+0

流的目的是提供一個共同的機制,將數據從一個位置傳輸到另一個位置。當數據可以被讀取時,它們還暴露諸如數據之類的事件。我會試着想出更多的複製和粘貼示例。 –

0

不知道這是否會幫助,但我發現,攔截從子進程的提示的唯一方法是,當你產生一個新的子設置分離選項設置爲true處理。

像你一樣,我找不到任何有關interwebs節點上的子進程提示的信息。人們會懷疑它應該去標準輸出,然後你必須寫入標準輸入。如果我沒有記錯,你可能會發現提示被髮送到stderr。

對我來說有點神奇,其他人沒有這個問題。也許我們只是做錯了。