basic ssh relay functionality
This commit is contained in:
26
src/background/isPortReachable.js
Normal file
26
src/background/isPortReachable.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// https://github.com/sindresorhus/is-port-reachable
|
||||||
|
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||||
|
|
||||||
|
const net = require('net');
|
||||||
|
|
||||||
|
module.exports = (port, opts) => {
|
||||||
|
opts = Object.assign({timeout: 1000}, opts);
|
||||||
|
|
||||||
|
return new Promise((resolve => {
|
||||||
|
const socket = new net.Socket();
|
||||||
|
|
||||||
|
const onError = () => {
|
||||||
|
socket.destroy();
|
||||||
|
resolve(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.setTimeout(opts.timeout);
|
||||||
|
socket.on('error', onError);
|
||||||
|
socket.on('timeout', onError);
|
||||||
|
|
||||||
|
socket.connect(port, opts.host, () => {
|
||||||
|
socket.end();
|
||||||
|
resolve(true);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
};
|
73
src/background/ssh.js
Normal file
73
src/background/ssh.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import appPath from './electronAppPath'
|
||||||
|
const { spawn } = require('child_process')
|
||||||
|
|
||||||
|
function getRandomInt(min, max) {
|
||||||
|
return Math.floor(Math.random() * (max - min)) + min;
|
||||||
|
}
|
||||||
|
|
||||||
|
let tryies = 5;
|
||||||
|
|
||||||
|
const startSSH = (port, host, user, password, callback) => {
|
||||||
|
let remotePort = getRandomInt(10000, 65000)
|
||||||
|
|
||||||
|
if(tryies-- <= 0)
|
||||||
|
{
|
||||||
|
if(callback)
|
||||||
|
callback(false)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = [
|
||||||
|
'-T',
|
||||||
|
'-R', `0.0.0.0:${remotePort}:127.0.0.1:${port}`,
|
||||||
|
`${user}@${host}`,
|
||||||
|
'-pw', password,
|
||||||
|
'-v'
|
||||||
|
]
|
||||||
|
console.log(options)
|
||||||
|
|
||||||
|
const ssh = spawn(appPath('plink'), options)
|
||||||
|
|
||||||
|
const checkMessage = (data) => {
|
||||||
|
if(data.includes(`Remote port forwarding from 0.0.0.0:${remotePort}`))
|
||||||
|
{
|
||||||
|
if(data.includes('refused'))
|
||||||
|
{
|
||||||
|
ssh.kill()
|
||||||
|
startSSH(port, host, user, password, callback)
|
||||||
|
}
|
||||||
|
else if(data.includes('enabled'))
|
||||||
|
{
|
||||||
|
if(callback)
|
||||||
|
callback({address: host, port: remotePort})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ssh.stdout.on('data', (data) => {
|
||||||
|
console.log(`ssh: ${data}`)
|
||||||
|
checkMessage(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
ssh.stderr.on('data', (data) => {
|
||||||
|
console.log(`ssh error: ${data}`);
|
||||||
|
checkMessage(data)
|
||||||
|
if(data.includes('Password authentication failed'))
|
||||||
|
{
|
||||||
|
ssh.kill()
|
||||||
|
if(callback)
|
||||||
|
callback(false)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ssh.on('close', (code, signal) => {
|
||||||
|
if(callback)
|
||||||
|
callback(false)
|
||||||
|
console.log(`ssh closed with code ${code} and signal ${signal}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
return ssh
|
||||||
|
}
|
||||||
|
|
||||||
|
export default startSSH
|
Reference in New Issue
Block a user