2013-08-30 180 views
2

我正在開發一個爲Linux發送命令的WebApp。 爲此,我在客戶端上使用Javascript/jQuery,在服務器上使用Node.js。 我的代碼是這樣的:如何獲得命令的返回?

客戶端

$("#myLink").click(function() { 
    $.get('http://myHost:myPort', {cmd: "rhythmbox-client --print-playing"}); 
}); 

服務器端(commands.js)

var exec = require('child_process').exec; 
var express = require('express'); 
var app = express(); 

app.get('/commands', function(req, res) { 
    var command = exec(req.query.cmd); 
}); 

app.listen(3000); 

這個工作並正常執行命令。 我需要的是獲得該命令生成的返回,例如,如果我在終端中運行命令「rhythmbox-client --print-playing」,它將返回當前正在播放的歌曲的名稱。 我想在我的應用程序的HTML頁面中使用這個名稱。

我應該在我的代碼中更改哪些內容以獲取要執行的命令生成的返回值?

謝謝 (對不起我的英文不好)

+1

嘗試增加'> SOME_FILE 2>&1'到命令,並在服務器上尋找some_file。然後你需要做的就是(1)每次讓這個文件有一個唯一的名字,並且(2)把它傳回給用戶。 **警告:您正在編寫一個安全漏洞,陌生人可能會執行諸如rm之類的不好的事情,或者嘗試將您的計算機從shell中解放出來**但只要您知道,盡情享受吧。 – Paul

+1

欲瞭解更多有創意的想法,請參閱reddit上的以下文章:[從網絡問題創建用戶](http://www.reddit.com/r/php/comments/1l7baq/) – dc5

+0

是的@Paul,我會處理命令收到並刪除「rm」等詞。 – Agneli

回答

3

傳遞一個回調函數給exec得到命令的輸出,這樣的:

var command = exec(req.query.cmd, function(err, stdout, stderr) { 
    res.send(stdout); 
}); 
+0

很酷。你能不能把stdout和stderr結合起來? – Paul

+0

看來這是正確的方法。 在Firebug上看到結果我看到現在有一​​個名爲HTML的選項卡,但是是空的。 :( – Agneli

+0

@Agneli您可以探索有關響應類型的express文檔。 – hulufei