I have the following code in my node.js app to test the SSH connection to a server using ssh2 :
var Connection = require('ssh2');
var conn = new Connection();
conn.on('ready', function() {
console.log('Connection :: ready');
conn.exec('uptime', function(err, stream) {
if (err) throw err;
stream.on('exit', function(code, signal) {
console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal);
}).on('close', function() {
console.log('Stream :: close');
conn.end();
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
});
}).connect({
host: serverIp,
port: serverPort,
username: serverUsername,
privateKey: require('fs').readFileSync('./id_rsa')
});
It works fine, but if it returns an error, if I get a connection timeout for example, the node.js app crashes...
I would like to do the following :
if an error is returned, simply redirect to /servers page without crashing the app.
I tried to change the "if (err) throw err;" line with "if (err) res.redirect('/servers');" but it doesn't work...
Can someone help me with this noobie question ? I'm new to node.js :)
thanks a lot.
Listen to the error event:
conn.on('error', function(e) { /* do whatever */ });
Right now, your process crashes b/c that connection error is unhandled.
Related
Hello I wrote code to connect to SSH, send command, but sadly I cant figure out how to parse it to JSON.
I've used stringify but sadly it push errors. Same for JSON.parse.
const Client = require('ssh2').Client;
const ifconfig = require('ifconfig-parser');
const conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec('ifconfig', function(err, stream) {
if (err) throw err;
let data = '';
stream.on('close', function(code, signal) {
console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
conn.end();
const json = ifconfig.parse(data);
console.log(json);
}).on('data', function(d) {
console.log('STDOUT: ' + d);
data += d;
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
});
}).connect({
host: '192.168.100.100',
port: 22,
username: 'username',
password: 'password'
});
I'm using ssh2 nodejs client (https://github.com/mscdex/ssh2)
I'm trying to do the following:
SSH into box.
Login to docker.
It will re-prompt for password. Enter that password.
I'm failing on 3rd step.
This is my code
var Client = require('ssh2').Client;
var conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec('sudo docker ps', {pty: true}, function(err, stream) {
if (err) throw err;
stream.on('close', function(code, signal) {
conn.end();
// data comes here
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
// stream.end(user.password+'\n');
^^ If i do this, it will work but I won't be able to do anything else afterwards
});
}).connect({
host: 'demo.landingpage.com',
username: 'demo',
password: 'testuser!'
});
How do I enter the password programmatically? (I'm already using {pty: true} while doing conn.exec
Please enlighten!
Assuming your stream is a duplex stream, you have the possibility to write into the stream without ending it by writing
.on('data', (data) => {
stream.write(user.password+'\n');
}
or you can use an cb function
function write(data, cb) {
if (!stream.write(data)) {
stream.once('drain', cb);
} else {
process.nextTick(cb);
}
}
and
.on('data', (data) => {
write(user.password+ '\n', () => {
console.log('done');
}
});
**I want to kill the process of the 'trai' command without closing the putty/command prompt OR how can I run the same command in background process OR where to pass 'CTRL+C' command in this code so that it will exitthe command **
var Client = require('ssh2').Client;
var conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec('trai', 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);
});
});
}).connect({
host: '***.***.***.',
port: 22,
username: 'frylock',
password: 'frylock'
});
As I am new to NodeJS please help me if i am wrong .
You should be able to forcefully close the exec() stream with stream.close(), or if you start your command(s) with a pseudo-tty (passing the pty: true option to exec()) you should be able to send a ctrl-c with stream.end('\x03').
I am fairly new to nodejs. I am trying to simply connect to my webserver below with a host, port, username and password and get the up time response as shown below. executing the file from commandline is not giving me any output, it just gives me an empty commandline. removing any of ip, port or username/pwd is throwing me errors though. What am I doing wrong?
var Client = require('ssh2').Client;
var conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec('uptime', 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);
});
});
}).connect({
host: '192.168.100.100',
port: 2122,
username: '!##!##!#',
password: '!##!##!'
});
// example output:
// Client :: ready
// STDOUT: 17:41:15 up 22 days, 18:09, 1 user, load average: 0.00, 0.01, 0.05
//
// Stream :: exit :: code: 0, signal: undefined
// Stream :: close
You need to attach an 'error' event handler to the actual connection object prior to any other handler.
var Client = require('ssh2').Client;
var conn = new Client();
conn.on('error', function(err) {
console.log('SSH - Connection Error: ' + err);
});
conn.on('end', function() {
console.log('SSH - Connection Closed');
});
conn.on('ready', function() {
// code to work with SSH
});
conn.connect({
host: '192.168.100.100',
port: 2122,
username: '!##!##!#',
password: '!##!##!'
});
I was having the same issue. Doing below resolved it -
const { Client } = require('ssh2');
How can I call functions one-by-one after completing? I have code like that, which must be executed continuously.
For example, I have:
var Connection = require('ssh2');
var c = new Connection();
c.on('connect', function() {
console.log('Connection :: connect');
});
c.on('ready', function() {
console.log('Connection :: ready');
c.exec('uptime', function(err, stream) {
if (err) throw err;
stream.on('data', function(data, extended) {
console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ')
+ data);
});
stream.on('end', function() {
console.log('Stream :: EOF');
});
stream.on('close', function() {
console.log('Stream :: close');
});
stream.on('exit', function(code, signal) {
console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal);
c.end();
});
});
});
c.on('error', function(err) {
console.log('Connection :: error :: ' + err);
});
c.on('end', function() {
console.log('Connection :: end');
});
c.on('close', function(had_error) {
console.log('Connection :: close');
});
c.connect({
host: '192.168.100.100',
port: 22,
username: 'frylock',
privateKey: require('fs').readFileSync('/here/is/my/key')
});
In what way can I call several functions one-by-one? When the connection to the ssh2 server is established, and the first request is executed, I have to parse the output of this request and send another request with data from the previous request.
I have functions which can do all this; the only problem is how to make another request after the first one is completed.
You can use nested callbacks. In the 'end' handler of each request, create a new connection and setup its end handler. Nest until needed. Similar to:
c.on('end', function() {
// after c is done, create newC
var newC = new Connection();
newC.on('end', function() {
// more if needed.
});
});
Another approach is to use some library for promises, like Q, which clears up the syntax a lot.
You can also take a look at this question: Understanding promises in node.js
From the sounds of it, you might want to look into a control flow node module such as async. Also you shouldn't need to tear down the connection just to execute another command on the same server.