node.js - Node中用于下载和删除文件的SFTP模块

标签 node.js sftp

我的任务很简单(或者更好,应该):从 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()返回一个返回流的 Promise,因此如果要将流保存到磁盘,则需要通过管道传输它。例如:

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),因此如果遇到问题,请记住这一点。

关于node.js - Node中用于下载和删除文件的SFTP模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41648624/

相关文章:

mysql - 使用Node.js进行MySQL连接池

javascript - 如何从 Mongoose 中的多个数组更新数组内的值?

php - 从 PHP 连接到安全的 FTP 服务器

java - JSch SFTP传输更改编码

python - 尝试使用 Python 传输 SFTP 文件时定义传输模式

java - J2SSH支持的密码/Mac

java - 使用JSch Java库SftpProgressMonitor或任何其他类/方法,如何监视SFTP文件传输的传输速度?

node.js - 如何通过 OctoPrint Rest API 传递命令?

javascript - 如何访问客户端服务器上设置的对象

node.js - 如何使用 node.js 限制同时连接到微服务的数量