2014-01-30 43 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); 
    }); 
});