[英]ssh persistent sessions with node.js
我正在使用 node.js,我正在嘗試在 web 瀏覽器中嵌入控制台以在遠程服務器中工作。 web 應用程序執行連接,因此用戶無需執行ssh username@host
,只需鍵入命令。
我已經嘗試過 node.js 的ssh2
模塊和其他使用 ssh2 的模塊。 但我總是遇到同樣的問題。 每次我使用exec()
以編程方式執行命令時, ssh session 都會重新啟動。 我會用一個例子更好地解釋它。
> ls
返回主目錄的內容,主目錄中的目錄之一是mydir
> cd mydir
> ls
再次返回我的主目錄的內容,因為在執行命令后 ssh session 被關閉/重新啟動。
任何可以完成這項工作的 node.js 庫? 甚至是不同於 javascript 的其他技術庫?
編輯:用於澄清的其他示例,使用 node.js 的模塊ssh-exec
服務器必須使用 ssh 在其他機器上執行一些命令。 服務器中的一個 function 包含以下代碼
var c = exec.connection('username@host.com'); // It takes the ssh key from the default location
exec('cd mydir', c).pipe(process.stdout);
exec('ls -lh', c).pipe(process.stdout);
如您所見,我沒有在第一次exec
后結束連接,但我獲得的 output 是主目錄的內容而不是 mydir 目錄的內容,因為 ssh Z21D6F40CFB511982E45424E0E2ZA 在每個exec
之后重置。
node.js ssh2模塊的維護者提供了解決方案。
要使用方法shell()
而不是方法exec()
。
shell()
方法與我們連接的服務器創建一個交互式會話。 shell()
方法提供一個流作為其回調的參數(類似於exec()
方法)。
就像使用exec()
, stream.on('data', function(data, extended) {...});
可用於獲取命令的輸出。 但是,在這種情況下,要向連接的機器提供命令(輸入),則需要使用stream.write(yourcommand+'\\n');
PS。 隨時進行編輯以提高答案的准確性。
我不得不猜測一下,但是您會執行child = exec('ssh username@host ls')
嗎?
你可以做類似的事情
child = exec('ssh username@host');
瀏覽器的前部和“循環”中
child.stdin.write('ls\n');
完成后,只需關閉stdin
:
child.stdin.end()
這也完成了子進程。
我知道此鏈接很舊,但我認為如果有人在尋找解決方案,這可能會有所幫助。 該
要使用方法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);
});
});
我需要訪問一個目錄,然后運行一個命令。 command1: cd /onu command2: show online slot 14 pon 14,有什么解決辦法嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.