ssh2-sftp-client get()请求提供“拒绝权限-错误”

问题描述 投票:0回答:2

我正在电子应用程序中使用此代码连接到需要收集一些数据的sftp服务器。我在列出/ out文件夹中的文件时没有问题,但是无法获取带有“已定义权限”错误的sftp文件。理想情况下,我希望能够使用get()文件并直接在函数中访问文本数据而无需存储到文件中。

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();
});
node.js ssh electron rsa
2个回答
0
投票

尝试一下,看看是否有效

'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


0
投票

查看您的代码,您有两个问题。

  1. 如果仅使用1个参数调用get(),它将返回一个缓冲区,而不是文件。要获取文件,只需执行

    client.get(sourceFilePath,localFilePath)

并且文件将在本地另存为localFilePath。这两个参数都是字符串,需要为完整路径,即包括文件名,而不仅仅是目录。第二个参数的文件名可以与第一个不同。但是,如果只想检索文件,则最好使用fastGet(),而不要使用get()。 get()方法非常适合您想在代码中使用数据做一些事情,例如缓冲区或写流管道/处理。 fastGet()方法比get()更快,因为它使用并发进程进行传输,但不允许使用缓冲区或流进行进一步处理。

  1. 您看到的错误消息是由于调用get()的方式引起的,或者表明您没有权限读取您尝试访问的文件(与您连接的用户)。最简单的检查方法是使用openSSH sftp程序(在Linux,mac和Windows上可用)和使用的密钥(使用-i开关)尝试下载文件。如果它因权限错误而失败,那么您就知道这是一个权限错误,而不是您的代码或ssh2-sftp-client模块的问题。

编辑:我刚刚注意到您也同时使用了密码和密钥文件。您不需要两者-两者都可以,但是您不需要两者都用。我倾向于尽可能使用密钥文件,因为这样可以避免将密码存储在某个地方。确保不要在密钥中添加密码。另外,您可以使用dotenv模块之类的东西,并将您的凭据和其他配置存储在.env文件中,而不将其签入版本控制。

© www.soinside.com 2019 - 2024. All rights reserved.