Node 中用于下载和删除文件的 SFTP 模块

SFTP modules in Node to download and delete files

我的任务很(或者更好,应该是)简单:从 Node 应用程序中获取 SFTP 目录的内容,然后下载其中的所有文件,最后远程删除它们。

现在,我检查了不同的模块。在我看来,非常干净的是 ssh2-sftp-client。我可以这样使用它:

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

sftp.connect({
    host: myhost,
    port: '22',
    username: myusername,
    password: mypassword
}).then(() => {
    return sftp.list('/path/to/my/files');
}).then((data) => {

    for(var i = 0 ; i < data.length; i++) {
        sftp.get('/path/to/my/files/'+data[i].name); 
        }   
}).catch((err) => {
    console.log(err, 'catch error');
});

我可以列出所有文件并在控制台中查看结果 jSon,但是 .get 命令似乎什么都不做,我不知道哪里出了问题。从文档 (https://www.npmjs.com/package/ssh2-sftp-client) 中,您可以像我一样简单地获取文件。但是:

1) 好像不行 2)我怎样才能调试发生了什么? 3)如果我没有机会选择本地目录,这些文件很可能会被下载到node启动js的地方,对吧?

那么,如果使用此模块(或其他模块,如果有的话)成功下载文件,我如何获取实际下载并可能被远程删除的文件?

谢谢, 法比奥

sftp.get() returns a Promise returns 一个流,所以如果你想将流保存到磁盘,你将需要通过管道传输它。例如:

var fs = require('fs');

// ...

for(var i = 0; i < data.length; i++) {
  const remoteFilename = '/path/to/remote/files/' + data[i].name;
  const localFilename = '/path/to/local/files/' + data[i].name;
  sftp.get(remoteFilename).then((stream) => {
    stream.pipe(fs.createWriteStream(localFilename));
  });
}

此外,ssh2-sftp-client 似乎没有使用 ssh2 模块的最新版本分支(撰写本文时为 v0.5.x),因此请记住这一点,如果你 运行 遇到问题。

我不确定会发生什么,但是当我 运行 这样的代码时,它只会下载一个文件。

for (var i = fileList.length - 1; i >= 0; i--) {

  remoteFilename = process.env.FTP_DEFAULT_DIR + '/' + fileList[i].name
  localFilename = fileList[i].name

  sftp.get(remoteFilename).then((stream) => {
    stream.pipe(fs.createWriteStream(localFilename));
    console.log(stream);
    console.log('processing: ', remoteFilename);
  }).catch((err)=> {
    console.log(err)
  });
}
sftp.get(remoteFileNameWithPath, true).then(stream => {
  stream.pipe(fs.createWriteStream(localFilePath)).on('close', () => console.log('completely passed file'))
})

get 方法 returns 一个带有流结果的承诺,因此,为了保存它,您需要通过管道传输到 writeStream 检查 nodejs 上的文档:https://nodejs.org/api/stream.html

使用 get() 方法下载并保存文件

sftp.get(remote_file_path, local_file_path).then((stream) => {
    console.log('File download Success')
}); 

需要两个参数:src和dest文件路径