Извините, если этот вопрос дублируется, но я не могу найти решение.
Кажется, моя проблема очень проста, но я не могу понять, что я делаю неправильно. Я хочу настроить ssh-клиент для подключения к нему и выполнить некоторые команды в оболочке. Итак, первое — я выбрал библиотеку ssh2 и попытался использовать следующий код.
var fs = require("fs");
var crypto = require("crypto");
var inspect = require("util").inspect;
var buffersEqual = require("buffer-equal-constant-time");
var ssh2 = require("ssh2");
var utils = ssh2.utils;
var pubKey = utils.genPublicKey(
utils.parseKey(fs.readFileSync("user.pub")),
);
new ssh2.Server(
{
hostKeys: [fs.readFileSync("host.key")],
},
function(client) {
console.log("Client connected!");
client
.on("authentication", function(ctx) {
if (
ctx.method === "password" &&
// Note: Don't do this in production code, see
// https://www.brendanlong.com/timing-attacks-and-usernames.html
// In node v6.0.0+, you can use `crypto.timingSafeEqual()` to safely
// compare two values.
ctx.username === "foo" &&
ctx.password === "bar"
)
ctx.accept();
else if (
ctx.method === "publickey" &&
ctx.key.algo === pubKey.fulltype &&
buffersEqual(ctx.key.data, pubKey.public)
) {
if (ctx.signature) {
var verifier = crypto.createVerify(ctx.sigAlgo);
verifier.update(ctx.blob);
if (verifier.verify(pubKey.publicOrig, ctx.signature))
ctx.accept();
else ctx.reject();
} else {
// if no signature present, that means the client is just checking
// the validity of the given public key
ctx.accept();
}
} else ctx.reject();
})
.on("ready", function() {
console.log("Client authenticated!");
client.on("session", function(accept, reject) {
var session = accept();
session.once("exec", function(accept, reject, info) {
console.log(
"Client wants to execute: " + inspect(info.command),
);
var stream = accept();
stream.stderr.write("Oh no, the dreaded errors!\n");
stream.write("Just kidding about the errors!\n");
stream.exit(0);
stream.end();
});
});
})
.on("end", function() {
console.log("Client disconnected");
});
},
).listen(0, "127.0.0.1", function() {
console.log("Listening on port " + this.address().port);
});
Я поместил его в файл index.js
. Перед использованием этого кода:
- Настроил пару ключей командой
ssh-keygen -t rsa -b 4096
, получил 2 ключаssh.pub
иssh
; - Затем переименован в
user.pub
иhost.key
; - После этого я сделал
ssh-add host.key
. Ответ былIdentity added: host.key (host.key)
. Кажется, все в порядке.
Я запустил node index.js
и получил следующую ошибку:
throw new Error('Missing passphrase for encrypted private key')
Что я сделал не так? Может быть, неправильная команда для создания пары ключей? Я буду очень признателен, если вы мне поможете.
index.js
? - person AKX   schedule 09.08.2018/node_modules/ssh2/lib/server.js:57
. Сервер не запущен. - person Merge-pony   schedule 09.08.2018ssh2.Server
. Смотрите редактирование моего ответа. - person AKX   schedule 09.08.2018