ssh2-sftp-client get () запрос отклонил разрешение - PullRequest
0 голосов
/ 07 октября 2019

Я использую этот код в своем электронном приложении для подключения к серверу sftp, где мне нужно собрать некоторые данные. У меня нет проблем с перечислением файлов в папке / out, но он не может получить файл sftp с ошибкой «ограниченное разрешение». В идеале я хотел бы иметь возможность получить файл () и получить доступ к текстовым данным непосредственно в функции без сохранения в файл.

let Client = require('ssh2-sftp-client');
let sftp = new Client();

var root = '/out';
var today = new Date();
var mon = ((today.getMonth()+1) < 10)? "0" + (today.getMonth()+1) : (today.getMonth()+1);
var date = (today.getDate() < 10)? "0" + today.getDate() : today.getDate();
var fileDate = mon + date;   


sftp.connect({
    host: '<server-address>',
    port: 2222,
    username: 'XXXXXXXX',
    password: 'xxxxxxxx',
    privateKey: fs.readFileSync(path.join(__dirname, '../rsa/<file-name-here>.pem'))
})
.then(() => {
    return sftp.list(root, 'SN5M' + fileDate);
})
.then((fileInfo) => { 
    if (fileInfo) {
        var filePath = root + '/' + fileInfo[fileInfo.length - 1].name;
        return sftp.get(filePath).then((file) => {
            console.log(file);
            event.returnValue = file;
            sftp.end();
        })
        .catch((err) => {
            console.log('File get error', err);
            event.returnValue = err;
            sftp.end();
        });
    }
})
.catch((err) => {
    console.log('File info error', err);
    event.returnValue = err;
    sftp.end();
});

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Глядя на ваш код, у вас есть две проблемы.

  1. Если вы вызываете get () только с одним аргументом, он возвращает буфер, а не файл. Чтобы получить файл, просто выполните

    client.get (sourceFilePath, localFilePath)

, и файл будет сохранен локально как localFilePath. Оба аргумента являются строками и должны быть полными путями, т.е. включать имя файла, а не только каталог. Имя файла для второго аргумента может отличаться от первого. Однако, если все, что вам нужно - это извлечь файл, лучше использовать fastGet(), а не get(). Метод get () подходит для случаев, когда вы хотите что-то сделать в коде с данными, например, в буфере или конвейере / обработке потока записи. Метод fastGet () работает быстрее, чем get (), поскольку он выполняет передачу с использованием параллельных процессов, но не позволяет использовать буферы или потоки для дальнейшей обработки.

Сообщение об ошибке, которое вы видите, связано либо с тем, как вы вызываете get (), либо с указанием того, что у вас нет разрешения на чтение файла, к которому вы пытаетесь получить доступ (как пользователь, с которым вы связаны). Самый простой способ проверить это - использовать программу openSSH sftp (доступную в Linux, mac и windows) и ключ, который вы используете (используйте ключ -i), чтобы попытаться загрузить файл. Если это происходит с ошибкой разрешения, то вы знаете, что это ошибка разрешения, а не проблема с вашим кодом или модулем ssh2-sftp-client.

РЕДАКТИРОВАТЬ: Я только что заметил, что вы также используете как пароль, так и файл ключа. Вам не нужно и то и другое - любой из них будет работать, но вам не нужно использовать оба. Я стараюсь использовать ключевой файл, когда это возможно, так как во избежание необходимости где-то хранить пароль. Убедитесь, что вы не добавили ключевую фразу к своему ключу. Кроме того, вы можете использовать что-то вроде модуля dotenv и хранить свои учетные данные и другие настройки в файле .env, который вы не проверяете в системе контроля версий.

0 голосов
/ 07 октября 2019

Попробуйте и посмотрите, работает ли он

get 'возвращает (String | Stream | Buffer).

let dst = fs.createWriteStream('/local/file/path/data.txt');
sftp.get(filePath,dst)

См. https://www.npmjs.com/package/ssh2-sftp-client#orga0dfcd5

...