ssh2-sftp-client get() 请求给出 'denied permission - error'

ssh2-sftp-client get() request giving 'denied permission - error'

我在我的电子应用程序中使用此代码连接到我需要收集一些数据的 sftp 服务器。我在 /out 文件夹中列出文件没有问题,但它无法获取带有 'deined permission' 错误的 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();
});

试试这个,看看它是否有效

'get' returns(字符串|流|缓冲区)。

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

参考https://www.npmjs.com/package/ssh2-sftp-client#orga0dfcd5

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

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

    client.get(sourceFilePath, localFilePath)

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

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

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