2014-01-30 42 views
0

我正在使用node.js,我試圖在Web瀏覽器中嵌入控制檯以在遠程服務器中工作。 Web應用程序執行連接,因此用戶不需要執行ssh [email protected],而只需鍵入命令。ssh與node.js的持久會話

我試過了node.js的'ssh2模塊和其他使用ssh2的模塊。但我總是遇到同樣的問題。每次我使用exec()以編程方式執行命令時,ssh會話都會重新啓動。我會用一個例子來更好地解釋它。

> ls 

返回主目錄的內容,在主目錄中的一個目錄mydir

> cd mydir 
> ls 

回到我的家目錄的內容再一次,因爲在執行命令後,SSH會話關閉/重新啓動。

任何可以完成這項工作的node.js庫?或者甚至是一個與JavaScript不同的其他技術庫?

編輯:用於澄清,使用的node.js'模塊ssh-exec 服務器具有執行使用ssh在其他機器的一些命令的其他例子。在服務器函數包含下面的代碼

var c = exec.connection('[email protected]'); // It takes the ssh key from the default location 
exec('cd mydir', c).pipe(process.stdout); 
exec('ls -lh', c).pipe(process.stdout); 

正如你可以看到我不是結束前exec但我得到的輸出是主目錄mydir目錄中沒有的內容的內容之後的連接,因爲在每個exec之後ssh會話都會重置。

回答

1

node.js的ssh2模塊的維護者提供瞭解決方案。

使用方法shell()代替方法exec()

方法shell()創建與我們正在連接的服務器的交互式會話。 方法shell()提供了一個流作爲其回調參數(如方法exec())。

與使用exec()時一樣,stream.on('data', function(data, extended) {...});可用於獲取命令的輸出。但是,在這種情況下,要爲您連接的機器提供命令(輸入),您需要使用stream.write(yourcommand+'\n');

PS。隨意編輯以提高答案的準確性。

0

我必須猜測一下,但是你做了類似child = exec('ssh [email protected] ls')的事嗎?

你可以做這樣的事情

child = exec('ssh [email protected]'); 

前期,並在瀏覽器中的 「循環」

child.stdin.write('ls\n'); 

完成後,只需關閉stdin

child.stdin.end() 

也完成孩子的過程。

+0

不是這樣的。我使用ajax來調用服務器中的一個函數,該函數使用先前創建的shh連接並執行'connection.exec('cd mydir')'。後來,其他ajax請求用其他命令調用該函數;該函數執行執行'connection.exec('ls')'的命令。我沒有輸出問題,並得到它並打印正常,但輸出不是預期的(它不是mydir的內容,而是主目錄的內容),因爲ssh會話似乎被重置在每個exec之後:( –

+0

不會有太大的變化,你的exec-call仍然有一個新的上下文,你需要在服務器端打開ssh連接並保持打開狀態(如果你願意的話,還可以設置空閒超時) – CFrei

+0

我是什麼試圖解釋的是,這是行不通的。如果我在服務器端以編程方式打開一個連接,之後立即執行'connection.exec('cd mydir')'並立即執行'connection.exec('ls ')'結果不是預期的,因爲連接似乎在每次執行後都被重置,我將編輯我的問題來澄清一個例子。 –

0

我知道這個鏈接是舊的,但我想這可能會幫助某人,如果他們正在尋找一個解決方案。

使用方法shell()而不是方法exec()。

作品。這是另一種解決方案。使用絕對文件路徑,即

conn.exec("mkdir -p /home/user/Direc/{one,two,three}/", function(err, stream) { 
     if (err) throw err; 
     stream.on('data', function(data) { 
      console.log('STDOUT: ' + data); 
     }).stderr.on('data', function(data) { 
      console.log('STDERR: ' + data); 
     }); 
    }); 

conn.exec("ls -la /home/user/", function(err, stream) { 
    if (err) throw err; 
    stream.on('close', function(code, signal) { 
     console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); 
     conn.end(); 
    }).on('data', function(data) { 
     console.log('STDOUT: ' + data); 
    }).stderr.on('data', function(data) { 
     console.log('STDERR: ' + data); 
    }); 
});