2013-03-25 27 views
1
var spawn = require("child_process").spawn; 
var child = spawn("scp" , ["-P9022", path_to_file, scp_remote_path]) 
child.stdout.on("data", function(){ 
    //Automatically type in password 
}) 

我試圖使用scp成刪除服務器,並自動輸入密碼(我知道,我應該使用公共密鑰身份驗證,而不是,但是這是除了點)。當我運行顯示的代碼時,我得到正確的密碼提示;無論如何,我可以通過代碼檢測到所述提示的存在嗎?在這種情況下,「數據」事件似乎沒有被觸發。的NodeJS:兒童事件處理

編輯:不知道這是否重要,但process.stdout.isTTY爲true。當然,我又試圖監聽的可讀事件process.stdin像這樣

process.stdin.on "readable",()-> 
     buf = process.stdin.read() 
     buf2 = process.stdout.read() 
     console.log "pin", buf, buf2 

回調函數被調用但兩者BUF和BUF2是空

+0

您使用的是什麼版本的節點? – AndyD 2013-03-26 00:45:40

+0

@AndyD v 0.10.0 – Naren 2013-03-26 16:26:14

回答

1

流具有節點0.10改變這可能是原因該事件沒有發射。理論上,添加「數據」事件偵聽器應該將可讀流切換爲向後兼容模式。但是,在開始聆聽「數據」時,事情可能已經處於某種狀態。 (這是我的理論,我可能完全錯了)

隨着節點0.10中新的可讀流,你不應該聽「數據」事件,而是聽「可讀」事件,然後從流。在這裏看到更多的信息readable event

試試這個:

child.stdout.on("readable", function(){ 
    var buf = child.stdout.read(); 
    // check that you got your complete prompt for password... 
    // write password to stdin... 
}); 
+0

最初沒有工作,回調沒有被調用。我看到0.10.1有一些變化,所以我升級了,現在調用回調,但'buf'爲空。 child.stdin.write「pass \ n」在回調中也不起作用。有什麼建議麼? – Naren 2013-03-27 02:43:30

+0

實際上,如果這是我唯一的事件,child.stdout.on(「可讀」,function(){..})永遠不會被調用。但是,如果我*也附加child.stdout.on(「data」,function(){}),那麼原始的可讀函數會被調用。 http://nodejs.org/api/stream.html#stream_event_readable「請注意,添加'data'事件偵聽器會將Readable流切換爲」舊模式「,數據在可用時立即發出,而不是等待你可以調用read()來消耗它。「似乎與它有關,儘管它仍然沒有意義。節點中的錯誤? – Naren 2013-03-27 02:55:06

+0

這聽起來像一個錯誤。 – AndyD 2013-03-28 10:07:20