对每个请求打开文件句柄,而不是只打开一次



这是关于可以从服务器下载文件的SFTP协议。

SFTP客户端将发出多个";读取";请求,可能是为了更快地下载多个文件。

在正常情况下,服务器会得到一个OPEN请求,然后乘以READ请求,再乘以CLOSE。

因此在OPEN请求中;打开";本地文件句柄(fs.open(,并且在CLOSE请求中关闭它(fs.close(。。。但是,如果客户端很顽皮,想做一些令人讨厌的事情,只发送多个对许多文件的OPEN请求,使服务器内存不足,该怎么办?

在这种情况下,我认为最好的解决方案是服务器打开READ请求中的文件句柄,并在读取完成后立即关闭它。但会产生其他问题吗?我的意思是,由于多个READ请求可以并行运行,因此可能会有许多打开的文件句柄指向同一个本地文件。

要将文件发送到客户端,可以使用createReadStream而不是fs.openfs.close,类似于

// in response section...
res.writeHead(200, headers);
fs.createReadStream(file).pipe(res)

fs.createReadStream((可以处理开始和结束字节,以处理每个后续的READ请求。请参见下文。此外,为了确保恶意用户没有提出请求,您应该在读取文件数据之前进行处理。如果这将是匿名的SFTP,您可以对请求者IP执行检查,并将单个IP限制为每个IP的单个打开/读取流。。。或者限制单个IP/Filepath组合。只需将其存储在本地变量中,然后在打开时添加到日志中,完成下载后删除它们。

fs.createReadStream('sample.txt', {
'flags': 'r',          //<string> See support of file system flags. Default: 'r'.
'encoding': null,      // <string> Default: null
'autoClose': true,     // <boolean> Default: true
'emitClose': false,    // <boolean> Default: false
'start': 0,            // <integer>
'end': Infinity,       // <integer> Default: Infinity
'highWaterMark': (64 * 1024),   // <integer> Default: 64 * 1024
});

An example to read the last 10 bytes of a file which is 100 bytes long:
fs.createReadStream('sample.txt', { start: 90, end: 99 });

来源:Node.js


改为使用:ftp srv

话虽如此,我认为使用一个名为FTP-srv的优秀FTP包会更好,它可以处理所有这些以及更多。我在生产中使用过它,每天有数百名用户和数千次每日下载/上传,没有问题。基于你帖子中的考虑因素,你将无法抵御恶意用户。尤其是当涉及到FTP/SFTP时,几乎每秒都会有大量恶意请求通过扫描机器人程序出现。你需要有一种方法来禁止你发现的恶意IP。ftp-srv将处理所有这些以及更多。

根据我的经验,最好的节点FTP服务器是:FTP-srv

请参阅:https://www.npmjs.com/package/ftp-srv

我与包裹没有任何关系

在这种情况下,我认为最好的解决方案是服务器打开READ请求中的文件句柄,并在读取完成后立即关闭它。

当然!

但会产生其他问题吗?

为什么应该这样做?

我的意思是,由于多个READ请求可以并行运行,因此可能会有许多打开的文件句柄指向同一个本地文件。

唯一的问题是,一旦达到打开文件的限制(我想您知道ulimit(,您的服务器将在下次打开时出错。在达到该限制之前,如果描述符用于不同的文件(或套接字、管道或设备…(,或者全部用于同一个文件,则没有任何区别。

我相信你有一个SFTP服务器,需要允许其他人从服务器读取

您必须创建公钥-私钥,并将公钥提供给客户端,和/或创建密码。只有真正的客户端应该在您的服务器上打开连接(限制DDOS类型的攻击(,

此外,虽然编码甚至SFTP都必须像数据库一样对待,并且应该共享连接(连接池(,但我的意思是说打开一次连接,然后进行尽可能多的读写,然后关闭连接。所以,即使需要异步读写文件,也必须首先异步打开连接和读写,并在完成后关闭连接,如果用例允许,您也可以在流中进行读写。

我没有详细说明如何进行流读写或其他任何事情,因为之前的答案已经很好地提到了它们。

最新更新