创建文件大小有限的文件

Mik*_*ike 4 files java

我编写了一个服务器(Ubuntu 14.04 LTS 服务器) -客户端-java 程序。

使用此程序,我可以将文本从我的 android 智能手机发送到我的服务器,并将其保存到receivedData文件中。

该程序在一个用户下运行,默认情况下,该用户没有分配 shell,也没有访问敏感数据或程序的权限。

我能想到的唯一安全问题是由于大量receivedData没有大小检查的 GB文件而导致内存不足。或者,当然是 DoS 攻击,但我认为我的服务器没有那么重要......

该程序仅用于学习目的,任何客户/黑客都不得使用(当然;)),但您现在永远不会..

那么,谁能告诉我是否可以直接创建receivedData文件大小有限的文件。在它达到文件大小的那一刻,它应该拒绝receivedData阻止它导致 OOM。

如果没有,我将需要将其实现到 Java 程序中...

mur*_*uru 16

有两种方法可以做到这一点:

  • 使用ulimitshell 实用程序,或使用setrlimit系统调用(ulimit依次调用)。
  • 使用文件系统配额和服务器进程的特殊用户,将限制该用户的使用量

ulimit/setrlimit

来自man 2 setrlimit

RLIMIT_FSIZE
      The maximum size of files that the process may create.  Attempts
      to extend a file beyond this  limit  result  in  delivery  of  a
      SIGXFSZ  signal.   By default, this signal terminates a process,
      but a process can catch this signal instead, in which  case  the
      relevant  system  call  (e.g., write(2), truncate(2)) fails with
      the error EFBIG.
Run Code Online (Sandbox Code Playgroud)

我不确定如何setrlimit从 Java调用该函数,但是这个 U&L 问题可能会有所帮助。或者,将 Java 服务器包装在脚本中:

RLIMIT_FSIZE
      The maximum size of files that the process may create.  Attempts
      to extend a file beyond this  limit  result  in  delivery  of  a
      SIGXFSZ  signal.   By default, this signal terminates a process,
      but a process can catch this signal instead, in which  case  the
      relevant  system  call  (e.g., write(2), truncate(2)) fails with
      the error EFBIG.
Run Code Online (Sandbox Code Playgroud)

文件系统配额:

我假设一个 ext4 文件系统,我不确定其他人。首先,我们需要在文件系统上启用配额。编辑/etc/fstab,并添加usrquota到相应分区的挂载选项。/例如,如果我们为 执行此操作,则最终条目将类似于:

UUID=... /               ext4    errors=remount-ro,usrquota 0       1
Run Code Online (Sandbox Code Playgroud)

然后重启后启用它:

sudo quotaon /
Run Code Online (Sandbox Code Playgroud)

我假设您的服务器以不同的用户身份运行(例如restricted_user)。如果没有,如果您不希望您的正常流程受到影响,请创建一个。

然后做:

sudo edquota restricted_user
Run Code Online (Sandbox Code Playgroud)

这将打开一个编辑器。

Disk quotas for user restricted_user (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdd1                   1087940    943718   1048576       9956        0        0
Run Code Online (Sandbox Code Playgroud)

将软限制和硬限制设置为适当的值(它们是 1024 字节的块,因此将您的限制除以 1024)。保存并退出。

那么用户将无法在该文件系统上使用超过1G的总量,计算他们拥有的所有文件。


当然,您仍然应该检查服务器程序中的大小。


May*_*hux 5

更新:

muru 的答案非常适合文件大小,我在这里提供了一个解决方案,即如何调整目录本身的大小,而不仅仅是一个文件。


没有直接的东西,因为文件系统将文件夹作为文件文件处理,它的限制是整个文件系统本身。

因此,作为解决问题的方法,您可以创建一个虚拟文件系统并将其安装在特定(空)目录上。

创建要挂载的虚拟文件系统的挂载点(~/test for me)

mkdir ~/test
Run Code Online (Sandbox Code Playgroud)

创建一个充满 /dev/zero 的文件,足够大到你想为虚拟文件系统保留的最大大小(我在这里做 1MB)

dd if=/dev/zero of=test.img bs=1024 count=0 seek=1024
Run Code Online (Sandbox Code Playgroud)

使用 ext4 文件系统格式化此文件

 mke2fs test.img
Run Code Online (Sandbox Code Playgroud)

在您创建的目录中挂载新格式化的磁盘空间作为挂载点

mount -o loop test.img ~/test
Run Code Online (Sandbox Code Playgroud)

然后使用这个目录