Nodejs:node-webkit 使用ssh2出错
Nodejs:node-webkit 使用ssh2出错
大家好,在使用node-webkit开发中使用了ssh2库链接远程主机,在连接的时候有时候会出现下面这个错误,平台是在windows下:
Uncaught node.js Error
Error: Initialization failed
at new DiffieHellman (crypto.js:438:21)
at Object.DiffieHellman (crypto.js:431:12)
at onKEXDH_GEX_GROUP (E:\work\Toki\node_modules\ssh2\lib\Connection.js:1628:22)
at Parser.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:117:5)
at Parser.EventEmitter.emit (events.js:101:17)
at Parser.parsePacket (E:\work\Toki\node_modules\ssh2\lib\Parser.js:459:12)
at Parser.execute (E:\work\Toki\node_modules\ssh2\lib\Parser.js:249:14)
at Socket.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:506:18)
at Socket.EventEmitter.emit (events.js:98:17)
at readableAddChunk (_stream_readable.js:156:16)
Nodejs:node-webkit 使用ssh2出错
大家好,在使用node-webkit开发中使用了ssh2库连接远程主机时,有时候会出现以下错误。平台是在Windows下:
Uncaught node.js Error
Error: Initialization failed
at new DiffieHellman (crypto.js:438:21)
at Object.DiffieHellman (crypto.js:431:12)
at onKEXDH_GEX_GROUP (E:\work\Toki\node_modules\ssh2\lib\Connection.js:1628:22)
at Parser.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:117:5)
at Parser.EventEmitter.emit (events.js:101:17)
at Parser.parsePacket (E:\work\Toki\node_modules\ssh2\lib\Parser.js:459:12)
at Parser.execute (E:\work\Toki\node_modules\ssh2\lib\Parser.js:249:14)
at Socket.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:506:18)
at Socket.EventEmitter.emit (events.js:98:17)
at readableAddChunk (_stream_readable.js:156:16)
解决方法
该错误通常是由于某些加密算法或库版本不兼容引起的。以下是一些可能的解决方法:
-
更新ssh2库:确保你使用的ssh2库是最新的版本。
npm install ssh2[@latest](/user/latest)
-
检查Node.js版本:确保你的Node.js版本与ssh2库兼容。ssh2通常支持最新的稳定版Node.js。
-
禁用Diffie-Hellman密钥交换:如果上述方法无效,可以尝试禁用Diffie-Hellman密钥交换,因为这可能是问题的根源。
示例代码:
const Client = require('ssh2').Client; const conn = new Client(); conn.on('ready', () => { console.log('Client :: ready'); conn.exec('ls -lh /etc', (err, stream) => { if (err) throw err; stream.on('close', (code, signal) => { console.log(`Stream :: close :: code: ${code}, signal: ${signal}`); conn.end(); }).on('data', (data) => { console.log(`STDOUT: ${data}`); }).stderr.on('data', (data) => { console.log(`STDERR: ${data}`); }); }); }).connect({ host: 'example.com', port: 22, username: 'username', password: 'password', algorithms: { kex: ['diffie-hellman-group1-sha1'] // 禁用Diffie-Hellman密钥交换 } });
-
使用其他加密算法:如果禁用Diffie-Hellman密钥交换仍然无法解决问题,可以尝试使用其他加密算法。例如,你可以指定支持的密钥交换算法列表。
通过以上步骤,你应该能够解决在node-webkit中使用ssh2时遇到的初始化失败问题。希望这些解决方案能帮助到你!
打开nw,输入nw:version。看看Node.js的版本号,我用的是0.8.4做测试,Node.js的版本是0.11.*。 这个错误的原因是Node.js的问题,我用0.11的Node.js跑ssh库得到的结果也不不稳定。
恩恩,已经提交,版本改为,node-webkit 版本改为0.8.* 之后没有出现问题,node.js 是v0.10.*,谢谢
这个问题通常是由于在Windows平台上使用ssh2
库时缺少OpenSSL支持导致的。ssh2
库依赖于OpenSSL来进行一些加密操作,如Diffie-Hellman密钥交换等。
解决方案:
1. 安装OpenSSL
确保你的系统已经安装了OpenSSL,并且环境变量PATH中包含了OpenSSL的路径。你可以从OpenSSL官网下载适用于Windows的OpenSSL版本。
2. 指定OpenSSL路径
如果你在Node.js环境中使用ssh2
库,可以通过设置环境变量来指定OpenSSL路径。可以在启动应用之前设置环境变量:
set OPENSSL_CONF=C:\path\to\openssl.cnf
或者在代码中动态设置:
process.env.OPENSSL_CONF = 'C:\\path\\to\\openssl.cnf';
3. 示例代码
以下是一个简单的示例代码,展示如何使用ssh2
连接到远程服务器:
const Client = require('ssh2').Client;
const conn = new Client();
conn.on('ready', () => {
console.log('Client :: ready');
conn.exec('uptime', (err, stream) => {
if (err) throw err;
stream.on('close', (code, signal) => {
console.log(`Stream :: close :: code: ${code}, signal: ${signal}`);
conn.end();
}).on('data', (data) => {
console.log(`STDOUT: ${data}`);
}).stderr.on('data', (data) => {
console.log(`STDERR: ${data}`);
});
});
}).connect({
host: 'example.com',
port: 22,
username: 'username',
password: 'password'
});
注意事项:
- 确保OpenSSL配置文件(
openssl.cnf
)的路径正确。 - 如果问题仍然存在,尝试更新
ssh2
库到最新版本。 - 在某些情况下,可能需要重新编译
ssh2
库以支持特定的OpenSSL版本。
希望这些步骤能够帮助你解决问题。