Я пишу небольшую утилиту для разработки для синхронизации файлов через ssh. Обычно я использую ssh-agent, настроенный в файле .bashrc, чтобы легко подключиться к моему серверу разработки. Я хотел бы использовать exec в сценарии, но вызов ssh-agent каждый раз, когда я делаю запрос, звучит немного неоптимально.
Есть ли способ, которым я мог бы выполнить код агента один раз, а затем заставить его работать для всех последующих запросов ssh, которые я делаю? Например. чтобы создать процесс оболочки, такой как эмулятор терминала, а затем использовать этот процесс для выполнения команды, а не вызывать новую оболочку с каждой командой.
Причина, по которой я хочу это сделать, заключается в том, что я не хочу хранить пароль в файле конфигурации.





Вы можете создать один процесс ssh, а затем выполнять другие команды, используя тот же процесс. Вот пример того, как использовать его для bash. Я создаю новую bash оболочку и выполняю команду ls -la и exit вы можете выполнять другие команды.
const cp = require("child_process")
class MyShell {
constructor(command) {
this._spawned = cp.spawn(command, {
stdio: ["pipe", "pipe", "inherit"],
})
}
execute(command, callback) {
this._spawned.stdin.write(command + "\n")
this._spawned.stdout.on("data", (chunk) => {
if (callback) {
callback(chunk.toString())
}
})
}
}
var myShell = new MyShell("bash")
myShell.execute("ls -la", (result) => {
console.info(result)
})
myShell.execute("exit")
Спасибо. Это именно то, что я искал, я могу использовать ssh, даже если приложение не знает, что есть ключ.
Я бы добавил небольшое улучшение здесь. В методе execute добавьте command=command+';echo done;'; ssh и scp, похоже, не выводят никаких данных, но повторяют что-то сразу после того, как команда работает, иначе обратный вызов не будет выполнен.
Что-то вроде github.com/mimecuvalo/paramikojs, наверное?